home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / doasm.s < prev    next >
Text File  |  1999-11-17  |  136KB  |  5,477 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        実行命令のアセンブル処理
  4. ;        < doasm.s >
  5. ;
  6. ;    $Id: doasm.s,v 4.9  1999 11/17(Wed) 03:19:02 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    symbol.equ
  14.     .include    register.equ
  15.     .include    tmpcode.equ
  16.     .include    cputype.equ
  17.     .include    eamode.equ
  18.     .include    error2.equ
  19.  
  20.     .cpu    68000
  21.     .text
  22.  
  23.  
  24. ;----------------------------------------------------------------
  25. ;    d1.wのレジスタ番号を命令コードのフィールドb2-b0にセット
  26. SETREGL    .macro
  27.     and.w    #$0007,d1
  28.     or.w    d1,d7
  29.     .endm
  30.  
  31. ;----------------------------------------------------------------
  32. ;    d1.wのレジスタ番号を命令コードのフィールドb11-b9にセット
  33. SETREGH    .macro
  34.     and.w    #$0007,d1
  35.     ror.w    #7,d1
  36.     or.w    d1,d7
  37.     .endm
  38.  
  39. ;----------------------------------------------------------------
  40. ;    d7.wの命令コードを出力する
  41. OPOUT    .macro
  42.     move.w    d7,d0
  43.     bsr    wrt1wobj
  44.     .endm
  45.  
  46. ;----------------------------------------------------------------
  47. ;    d7.wの命令コードを出力する(実効アドレス書き換え用)
  48. DSPOPOUT    .macro
  49.     tst.b    (DSPADRCODE,a6)
  50.     beq    @skip1            ;(d,An)/(d,PC)ではない
  51.     move.w    #T_DSPCODE,d0
  52.     bsr    wrtobjd0w
  53.     move.w    d7,d0
  54.     bsr    wrtd0w
  55.     addq.l    #2,(LOCATION,a6)
  56.     bra    @skip2
  57. @skip1:
  58.     move.w    d7,d0
  59.     bsr    wrt1wobj
  60. @skip2:
  61.     .endm
  62.  
  63. ;----------------------------------------------------------------
  64. ;    d7.wの命令コードを出力する+rts
  65. OPOUTrts    .macro
  66.     move.w    d7,d0
  67.     bra    wrt1wobj
  68.     .endm
  69.  
  70. ;----------------------------------------------------------------
  71. ;    オペランドの区切りをチェックする
  72. CHKLIM    .macro
  73.     cmpi.w    #','|OT_CHAR,(a0)+
  74.     bne    iloprerr
  75.     .endm
  76.  
  77.  
  78. ;----------------------------------------------------------------
  79. ;    パス1(命令のアセンブル)
  80. ;----------------------------------------------------------------
  81. asmpass1::
  82.     move.b    #1,(ASMPASS,a6)
  83.     lea.l    (TEMPFILPTR,a6),a0
  84.     move.l    a0,(OUTFILPTR,a6)
  85.     bsr    maketmpname        ;テンポラリファイル作成準備
  86.     bsr    createopen        ;テンポラリファイルをオープンする
  87.     bsr    setsymdebfile        ;'-g'スイッチ指定時のファイル名準備
  88.  
  89.     sf.b    (ISASMEND,a6)
  90.     clr.l    (LINENUM,a6)
  91.     sf.b    (ISOBJOUT,a6)
  92.     clr.w    (OBJCONCTR,a6)
  93.     sf.b    (ISIFSKIP,a6)
  94.  
  95.     clr.w    (IFNEST,a6)
  96.     clr.w    (INCLDNEST,a6)
  97.     clr.w    (MACNEST,a6)
  98.     clr.w    (MACREPTNEST,a6)
  99.     clr.w    (MACLOCSMAX,a6)
  100.     clr.w    (SCDATTRIB,a6)        ;(SCDATTRIB & SCDATRPREV)
  101.     clr.w    (SCDLN,a6)
  102.     sf.b    (ISMACDEF,a6)
  103.  
  104.     move.l    (TEMPPTR,a6),d0        ;数字ローカルラベルの番号のテーブルを初期化
  105.     doquad    d0
  106.     movea.l    d0,a0
  107.     move.w    (LOCALNUMMAX,a6),d1    ;必ず偶数
  108.     add.w    d1,d1
  109.     lea.l    (a0,d1.w),a1
  110.     move.l    a1,(TEMPPTR,a6)
  111.     bsr    memcheck
  112.     move.l    a0,(LOCALMAXPTR,a6)
  113.     moveq.l    #0,d0
  114.     lsr.w    #2,d1
  115.     subq.w    #1,d1
  116. asmpass101:
  117.     move.l    d0,(a0)+
  118.     dbra    d1,asmpass101
  119.  
  120.     bsr    resetlocctr        ;ロケーションカウンタの初期化
  121.  
  122.     moveq.l    #-1,d0
  123.     move.l    d0,(LASTSYMLOC,a6)
  124.  
  125.     move.l    sp,(SPSAVE,a6)
  126.     lea.l    (asm1loop9,pc),a0
  127.     move.l    a0,(ERRRET,a6)
  128.     bra    asm1loop9
  129.  
  130. asm1loop:
  131.     or.w    #T_LINE,d0
  132.     bsr    wrtobjd0w        ;1行開始
  133.     move.l    (LOCATION,a6),(LTOPLOC,a6)
  134.     bsr    encodeline        ;命令・オペランドのコード化
  135.     bsr    asmline            ;命令のアセンブル
  136.     bsr    deflabel        ;必要ならラベルを定義する
  137. asm1loop9:
  138.     bsr    getline            ;1行読み込み
  139.     tst.w    d0
  140.     bpl    asm1loop
  141.  
  142.     lea.l    (asm1loop91,pc),a0
  143.     move.l    a0,(ERRRET,a6)
  144.     move.w    (IFNEST,a6),d0
  145.     clr.w    (IFNEST,a6)
  146.     tst.w    d0
  147.     bne    misiferr_eof        ;.ifの途中でソースが終了した
  148. asm1loop91:
  149.  
  150.     lea.l    (asm1loop92,pc),a0
  151.     move.l    a0,(ERRRET,a6)
  152.     bsr    offsymtailchk        ;offsymが正常に終了しているかどうか確認する
  153.                     ;a1を破壊する
  154. asm1loop92:
  155.  
  156.     moveq.l    #SECT_TEXT,d0
  157.     bsr    chgsection        ;.textセクションに戻す
  158.     clr.w    d0            ;move.w #T_EOF,d0
  159.     bsr    wrtobjd0w        ;ファイル終了
  160.     lea.l    (TEMPFILPTR,a6),a1
  161.     bsr    fflush            ;テンポラリファイルをフラッシュする
  162.     rts
  163.  
  164.  
  165. ;----------------------------------------------------------------
  166. ;    1命令アセンブル
  167. ;----------------------------------------------------------------
  168. asmline::
  169.     clr.w    (DSPADRCODE,a6)        ;(DSPADRCODE & DSPADRDEST)
  170.  
  171.     move.l    (CMDTBLPTR,a6),(ERRMESSYM,a6)    ;エラーメッセージに埋め込むシンボル
  172.                         ;(0の場合もある)
  173.  
  174.     tst.b    (ISMACRO,a6)
  175.     bne    domacro            ;マクロ命令
  176.  
  177.     move.l    (CMDTBLPTR,a6),d0
  178.     beq    asmline9        ;命令がない
  179.     movea.l    d0,a1
  180.  
  181.     tst.w    (SYM_ARCH,a1)        ;命令のCPUタイプ
  182.     beq    dopseudo        ;0なら疑似命令
  183.  
  184.     tst.b    (SYM_NOOPR,a1)
  185.     bne    asmline1        ;オペランドを取らない命令
  186.  
  187.     move.l    a1,-(sp)
  188.     movea.l    (LINEPTR,a6),a0
  189.     bsr    encodeopr
  190.     move.l    (sp)+,a1
  191.  
  192. asmline1:
  193.     btst.b    #0,(LOCATION+3,a6)
  194.     beq    asmline2
  195.     bsr    alignwarn_op        ;偶数境界に合っていないのでワーニングを出す
  196.  
  197. asmline2:
  198.     lea.l    (OPRBUF,a6),a0
  199.     lea.l    (EABUF1,a6),a4
  200.     lea.l    (EABUF2,a6),a5
  201.  
  202.     move.w    (SYM_OPCODE,a1),d7    ;命令コード基本パターン
  203.     move.l    (SYM_FUNC,a1),a2
  204.     clr.w    (SOFTFLAG,a6)
  205.     clr.b    (ABSLTOOPCCAN,a6)
  206.     sf.b    (PCTOABSLCAN,a6)
  207.     jsr    (a2)            ;処理ルーチンへジャンプ
  208. asm1skipbase:
  209.     tst.w    (a0)
  210.     bne    asm1toomanyopr        ;行が終了していない
  211.  
  212. asm1skipofst    equ    (*)-asm1skipbase
  213. ;ここではa0を破壊してよい
  214. ;F43G対策
  215.     tst.b    (F43GTEST,a6)
  216.     beq    asm1nofp
  217. ;5番目の命令ならば1番目に付けたNOPを有効にする
  218.     movea.l    (F43GPTR,a6),a0
  219.     btst.b    #4,(12,a0)        ;5番目の命令か?
  220.     beq    asm1notfifth
  221.     movea.l    (a0),a0            ;1番目
  222. ;一致したのでT_NOPDEATHをT_NOPALIVEに変更する
  223.     movem.l    d1/a1,-(sp)
  224.     move.w    #T_NOPALIVE+1,d0
  225.     move.l    (8,a0),d1        ;T_NOPDEATHの位置
  226.     lea.l    (TEMPFILPTR,a6),a1
  227.     bsr    fmodifyw
  228.     movem.l    (sp)+,d1/a1
  229.     movea.l    (F43GPTR,a6),a0
  230. asm1notfifth:
  231. ;<a0.l:F43GPTR(a6)
  232. ;次のレコードを用意する
  233.     movea.l    (a0),a0            ;次のレコード
  234.     move.l    a0,(F43GPTR,a6)
  235. ;    clr.l    8(a0)
  236.     clr.w    (12,a0)
  237. asm1nofp:
  238.  
  239. asmline9:
  240.     rts
  241.  
  242. asm1toomanyopr:
  243.     cmpi.w    #','|OT_CHAR,(a0)
  244.     beq    iloprerr_too_many    ;引数が多すぎる
  245.     bra    iloprerr        ;tst (0,a0)+などの不正なオペランド
  246.  
  247.  
  248. ;----------------------------------------------------------------
  249. ;    実効アドレスデータの出力
  250. ;----------------------------------------------------------------
  251.  
  252. ;----------------------------------------------------------------
  253. ;    実効アドレスに必要なデータを出力する
  254. ;    in :a1=実効アドレス解釈バッファへのポインタ
  255. ;    out:---
  256. eadataout:
  257.     moveq.l    #0,d0
  258.     move.b    (EADTYPE,a1),d0
  259.     beq    ead_none
  260.     add.w    d0,d0
  261.     move.w    (eajmp_tbl,pc,d0.w),d0
  262.     move.l    (RPNBUF1,a1),d1
  263.     tst.w    (RPNLEN1,a1)
  264.     jmp    (eajmp_tbl,pc,d0.w)
  265.  
  266. ead_none:
  267.     rts
  268.  
  269. eajmp_tbl:
  270.     .dc.w    ead_none-eajmp_tbl    ;Dn/An
  271.     .dc.w    ead_none-eajmp_tbl    ;(An)/(An)+/-(An)
  272.     .dc.w    ead_dspadr-eajmp_tbl    ;(d,An)
  273.     .dc.w    ead_idxadr-eajmp_tbl    ;(d,An,Rn)
  274.     .dc.w    ead_bdadr-eajmp_tbl    ;(bd,An,Rn)
  275.     .dc.w    ead_memadr-eajmp_tbl    ;([bd,An,Rn],od)
  276.     .dc.w    ead_dsppc-eajmp_tbl    ;(d,PC)
  277.     .dc.w    ead_idxpc-eajmp_tbl    ;(d,PC,Rn)
  278.     .dc.w    ead_bdpc-eajmp_tbl    ;(bd,PC,Rn)
  279.     .dc.w    ead_mempc-eajmp_tbl    ;([bd,PC,Rn],od)
  280.     .dc.w    ead_abslw-eajmp_tbl    ;xxxx.l/xxxx.w
  281.     .dc.w    ead_imm-eajmp_tbl    ;#xxxx
  282.  
  283. ;----------------------------------------------------------------
  284. ead_dspadr:                ;(d,An)
  285.     bmi    ead_dspadr5
  286.     move.w    #T_DSPADR,d0        ;式の場合
  287.     move.b    (DSPADRDEST,a6),d0    ;(move デスティネーション対策)
  288. ead_dspadr0:
  289.     bsr    wrtobjd0w
  290.     addq.l    #2,(LOCATION,a6)
  291.     tst.b    (RPNSIZE1,a1)
  292.     bmi    ead_dspadr1
  293.     moveq.l    #SZ_WORD,d0        ;(ワードディスプレースメント確定)
  294. ead_outrpn:
  295.     move.w    (RPNLEN1,a1),d1
  296.     lea.l    (RPNBUF1,a1),a1
  297.     bra    wrtrpn            ;式を出力する
  298.  
  299. ead_dspadr1:                ;(ディスプレースメントサイズ未定)
  300.     moveq.l    #SZ_WORD|ESZ_OPT,d0    ;(最適化対象)
  301.     tst.b    (EXTSIZEFLG,a6)
  302.     beq    ead_outrpn
  303.     moveq.l    #SZ_LONG|ESZ_OPT,d0    ;(最適化対象)
  304.     addq.l    #4,(LOCATION,a6)    ;デフォルトが.lなら2+4バイト
  305.     bra    ead_outrpn
  306.  
  307. ead_dspadr5:                ;定数の場合(ワードディスプレースメント確定)
  308.     move.l    d1,d0
  309.     ext.l    d0
  310.     cmp.l    d1,d0
  311.     beq    wrt1wobj        ;-$8000~$7FFF
  312.     cmp.l    #$00010000,d1
  313.     bcc    ilrelerr_outside    ;$10000以上
  314.     bsr    shvalwarn_d16        ;$8000~$FFFF
  315.     bra    wrt1wobj
  316.  
  317. ;----------------------------------------------------------------
  318. ead_idxadr:                ;(d,An,Rn)
  319.     bmi    ead_idxadr5
  320.     move.w    #T_IDXADR,d0        ;式の場合
  321. ead_idxadr0:
  322.     bsr    wrtobjd0w
  323.     addq.l    #2,(LOCATION,a6)
  324.     move.w    (EXTCODE,a1),d0
  325.     bsr    wrtd0w            ;拡張ワード
  326.     tst.b    (RPNSIZE1,a1)
  327.     bmi    ead_idxadr1
  328.     moveq.l    #SZ_SHORT,d0        ;(ショートディスプレースメント確定)
  329.     bra    ead_outrpn
  330.  
  331. ead_idxadr1:                ;(ディスプレースメントサイズ未定)
  332.     moveq.l    #SZ_SHORT|ESZ_OPT,d0    ;(最適化対象)
  333.     tst.b    (EXTSIZEFLG,a6)
  334.     beq    ead_outrpn        ;-eスイッチなしの場合のデフォルトは.s
  335.     moveq.l    #SZ_LONG|ESZ_OPT,d0    ;(最適化対象)
  336.     add.l    #4,(LOCATION,a6)
  337.     bra    ead_outrpn
  338.  
  339. ead_idxadr5:                ;定数の場合(ショートディスプレースメント確定)
  340.     move.l    d1,d0
  341.     ext.w    d0
  342.     ext.l    d0
  343.     cmp.l    d1,d0
  344.     beq    ead_idxadr6        ;-$80~$7F
  345.     cmp.l    #$00000100,d1
  346.     bcc    ilrelerr_outside    ;$100以上
  347.     bsr    shvalwarn_d8        ;$80~$FF
  348. ead_idxadr6:
  349.     and.w    #$00FF,d0
  350.     or.w    (EXTCODE,a1),d0        ;ディスプレースメントを拡張ワードと合成
  351.     bra    wrt1wobj
  352.  
  353. ;----------------------------------------------------------------
  354. ead_bdadr:                ;(bd,An,Rn)
  355.     move.w    #T_EXTCODE,d0
  356.     bsr    wrtobjd0w
  357.     move.w    (EXTCODE,a1),d0
  358.     bsr    wrtd0w            ;拡張ワード
  359.     addq.l    #2,(LOCATION,a6)
  360.  
  361.     tst.w    (RPNLEN1,a1)
  362.     bmi    ead_bdadr5
  363.     beq    ead_bdadr9        ;ベースディスプレースメントがない
  364.     move.w    #T_BDADR,d0        ;式の場合
  365. ead_bdadr0:
  366.     bsr    wrtobjd0w
  367.     move.b    (RPNSIZE1,a1),d0
  368.     bmi    ead_bdadr1
  369.     bsr    getdtsize        ;(ディスプレースメントサイズ指定あり)
  370.     add.l    d0,(LOCATION,a6)
  371.     move.b    (RPNSIZE1,a1),d0
  372.     bra    ead_outrpn        ;(ワード or ロングワード)
  373.  
  374. ead_bdadr1:                ;(ディスプレースメントサイズ未定)
  375.     move.l    (EXTLEN,a6),d0
  376.     add.l    d0,(LOCATION,a6)
  377.     move.b    (EXTSIZE,a6),d0
  378.     or.b    #ESZ_OPT,d0        ;(最適化対象)
  379.     bra    ead_outrpn
  380.  
  381. ead_bdadr5:                ;定数の場合
  382.     cmpi.b    #SZ_WORD,(RPNSIZE1,a1)
  383.     beq    ead_dspadr5        ;ワードディスプレースメント
  384.     move.l    d1,d0
  385.     bra    wrt1lobj
  386.  
  387. ead_bdadr9:
  388.     rts
  389.  
  390. ;----------------------------------------------------------------
  391. ead_memadr:                ;([bd,An,Rn],od)
  392.     move.l    a1,-(sp)
  393.     bsr    ead_bdadr        ;ベースディスプレースメントの処理
  394. ead_memadr0:
  395.     movea.l    (sp)+,a1
  396.     tst.w    (RPNLEN2,a1)
  397.     bmi    ead_memadr5
  398.     beq    ead_memadr9        ;アウタディスプレースメントがない
  399.     move.w    #T_OD,d0        ;式の場合
  400.     bsr    wrtobjd0w
  401.     move.b    (RPNSIZE2,a1),d0
  402.     bmi    ead_memadr1
  403.     bsr    getdtsize        ;(ディスプレースメントサイズ指定あり)
  404.     add.l    d0,(LOCATION,a6)
  405.     move.b    (RPNSIZE2,a1),d0    ;(ワード or ロングワード)
  406. ead_outodrpn:
  407.     move.w    (RPNLEN2,a1),d1
  408.     lea.l    (RPNBUF2,a1),a1
  409.     bra    wrtrpn            ;式を出力する
  410.  
  411. ead_memadr1:                ;(ディスプレースメントサイズ未定)
  412.     move.l    (EXTLEN,a6),d0
  413.     add.l    d0,(LOCATION,a6)
  414.     move.b    (EXTSIZE,a6),d0
  415.     or.b    #ESZ_OPT,d0        ;(最適化対象)
  416.     bra    ead_outodrpn
  417.  
  418. ead_memadr5:                ;定数の場合
  419.     move.l    (RPNBUF2,a1),d1
  420.     cmpi.b    #SZ_WORD,(RPNSIZE2,a1)
  421.     beq    ead_dspadr5        ;ワードディスプレースメント
  422.     move.l    d1,d0
  423.     bra    wrt1lobj
  424.  
  425. ead_memadr9:
  426.     rts
  427.  
  428. ;----------------------------------------------------------------
  429. ead_dsppc:                ;(d,PC)
  430.     bmi    ead_dsppc5
  431.     move.w    #T_DSPPC,d0        ;式の場合
  432.     tst.b    (OPTIONALPC,a1)
  433.     beq    ead_dspadr0
  434.     move.w    #T_DSPOPC,d0        ;(絶対ロングへの変換可能なPC)
  435.     bsr    wrtobjd0w
  436.     addq.l    #2,(LOCATION,a6)
  437.     moveq.l    #SZ_WORD|ESZ_OPT,d0    ;(最適化対象)
  438.     tst.b    (EXTSHORT,a6)        ;(68000/68010でも有効)
  439.     beq    ead_outrpn
  440.     moveq.l    #SZ_LONG|ESZ_OPT,d0    ;(最適化対象)
  441.     addq.l    #2,(LOCATION,a6)    ;デフォルトが.lなら4バイト
  442.     bra    ead_outrpn
  443.  
  444. ead_dsppc5:                ;定数の場合
  445.     move.l    d1,d0
  446.     ext.l    d0
  447.     cmp.l    d1,d0
  448.     bne    ilrelerr_outside
  449.     bra    wrt1wobj        ;-$8000~$7FFF
  450.  
  451. ;----------------------------------------------------------------
  452. ead_idxpc:                ;(d,PC,Rn)
  453.     bmi    ead_idxpc5
  454.     move.w    #T_IDXPC,d0        ;式の場合
  455.     bra    ead_idxadr0
  456.  
  457. ead_idxpc5:                ;定数の場合
  458.     move.l    d1,d0
  459.     ext.w    d0
  460.     ext.l    d0
  461.     cmp.l    d1,d0
  462.     bne    ilrelerr_outside
  463.     and.w    #$00FF,d0        ;-$80~$7F
  464.     or.w    (EXTCODE,a1),d0        ;ディスプレースメントを拡張ワードと合成
  465.     bra    wrt1wobj
  466.  
  467. ;----------------------------------------------------------------
  468. ead_bdpc:                ;(bd,PC,Rn)
  469.     move.w    (EXTCODE,a1),d0
  470.     andi.w    #EXW_BS,d0
  471.     bne    ead_bdadr        ;ZPCはAnと同じ扱い
  472.  
  473.     move.w    #T_EXTCODE,d0
  474.     bsr    wrtobjd0w
  475.     move.w    (EXTCODE,a1),d0
  476.     bsr    wrtd0w            ;拡張ワード
  477.     addq.l    #2,(LOCATION,a6)
  478.  
  479.     tst.w    (RPNLEN1,a1)
  480.     bmi    ead_bdpc5
  481.     beq    ead_bdpc9        ;ベースディスプレースメントがない
  482.     move.w    #T_BDPC,d0        ;式の場合
  483.     bra    ead_bdadr0
  484.  
  485. ead_bdpc5:                ;定数の場合
  486.     cmpi.b    #SZ_WORD,(RPNSIZE1,a1)
  487.     beq    ead_dsppc5        ;ワードディスプレースメント
  488.     move.l    d1,d0
  489.     bra    wrt1lobj
  490.  
  491. ead_bdpc9:
  492.     rts
  493.  
  494. ;----------------------------------------------------------------
  495. ead_mempc:                ;([bd,PC,Rn],od)
  496.     move.l    a1,-(sp)
  497.     bsr    ead_bdpc        ;ベースディスプレースメントの処理
  498.     bra    ead_memadr0
  499.  
  500. ;----------------------------------------------------------------
  501. ead_abslw:                ;xxxx.l/xxxx.w
  502.     bmi    ead_abslw5
  503.     cmpi.b    #SZ_WORD,(RPNSIZE1,a1)    ;式の場合
  504.     beq    ead_abslw1
  505.     addq.l    #4,(LOCATION,a6)    ;絶対ロング
  506.     moveq.l    #ESZ_ABS|SZ_LONG,d0
  507.     bra    ead_outrpn
  508.  
  509. ead_abslw1:                ;絶対ショート
  510.     addq.l    #2,(LOCATION,a6)
  511.     moveq.l    #ESZ_ABS|SZ_WORD,d0
  512.     bra    ead_outrpn
  513.  
  514. ead_abslw5:                ;定数の場合
  515.     cmpi.b    #SZ_WORD,(RPNSIZE1,a1)
  516.     beq    ead_abslw6
  517.     bsr    abswarn            ;絶対ロング
  518.     move.l    d1,d0
  519.     bra    wrt1lobj
  520.  
  521. ead_abslw6:                ;絶対ショート
  522.     move.l    d1,d0
  523.     ext.l    d0
  524.     cmp.l    d1,d0
  525.     beq    ead_abslw7        ;-$8000~$7FFF
  526.     cmp.l    #$00010000,d1
  527.     bcc    ilvalueerr        ;$10000以上
  528.     bsr    shvalwarn_absw        ;$8000~$FFFF
  529. ead_abslw7:
  530.     bsr    absshwarn
  531.     bra    wrt1wobj
  532.  
  533. ;----------------------------------------------------------------
  534. ead_imm0:
  535.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  536.     bne    ead_imm01
  537.     tst.b    (EAIMMCNT,a1)        ;(cmpi.b #1-1,(EAIMMCNT,a1))
  538.     bne    iloprerr        ;.lでオペランドが2つ以上あればエラー
  539. ead_imm01:
  540.     tst.w    (RPNLEN1,a1)
  541. ead_imm:                ;#xxxx
  542.     bmi    ead_imm5
  543.     move.b    (CMDOPSIZE,a6),d0    ;式の場合
  544.     cmp.b    #SZ_LONG,d0
  545.     bne    ead_imm1
  546.     addq.l    #2,(LOCATION,a6)    ;.l
  547. ead_imm1:
  548.     addq.l    #2,(LOCATION,a6)    ;.b/.w
  549.     bra    ead_outrpn
  550.  
  551. ead_imm5:                ;定数の場合
  552.     move.b    (CMDOPSIZE,a6),d0
  553.     bra    wrtimm            ;データを出力する
  554.  
  555. ;----------------------------------------------------------------
  556. ;5番目のチェック
  557. ;ソフトウェアエミュレーションはあらかじめ弾いておくこと
  558. ;<EACODE(a1):モード*8+レジスタ
  559. f43g_fifth::
  560.     cmpi.w    #%010_000,(EACODE,a1)
  561.     blo    f43g_fifth1
  562.     cmpi.w    #%110_111,(EACODE,a1)
  563.     bhi    f43g_fifth1
  564. ;アドレッシングモードチェックなし
  565. f43g_fifthadr::
  566.     tst.b    (F43GTEST,a6)
  567.     beq    f43g_fifth1
  568. ;any form of address register indirect addressing mode
  569.     move.l    a0,-(sp)
  570.     movea.l    (F43GPTR,a6),a0
  571.     movea.l    (4,a0),a0        ;直前のレコード
  572.     btst.b    #3,(12,a0)
  573.     beq    f43g_fifth2        ;直前が4番目ではない
  574.     movea.l    (4,a0),a0        ;3番目のレコード
  575.     move.w    (EACODE,a1),d0        ;今回のレジスタ番号(下位3ビット)
  576.     btst.b    d0,(13,a0)        ;3番目のレジスタ番号と比較
  577.     beq    f43g_fifth2        ;レジスタ番号が異なる
  578.     movea.l    (F43GPTR,a6),a0
  579.     or.b    #%10000,(12,a0)        ;5番目に該当する
  580. ;    bset.b    d0,13(a0)        ;レジスタ番号(不要)
  581. f43g_fifth2:
  582.     movea.l    (sp)+,a0
  583. f43g_fifth1:
  584.     rts
  585.  
  586. ;----------------------------------------------------------------
  587. ;4番目と5番目のチェック
  588. ;<d7.w:浮動小数点命令コード(下位6ビットがモードとレジスタ)
  589. f43g_fourth::
  590.     tst.b    (F43GTEST,a6)
  591.     beq    f43g_fourth1
  592.     move.w    #C060,d0
  593.     and.w    (SOFTFLAG,a6),d0
  594.     bne    f43g_fourth1
  595.     moveq.l    #%111_111,d0
  596.     and.w    d7,d0            ;アドレッシングモード
  597.     cmp.w    #%010_000,d0
  598.     blo    f43g_fourth1
  599.     cmp.w    #%110_111,d0
  600.     bhi    f43g_fourth1
  601. ;any form of address register indirect addressing mode
  602.     move.l    a0,-(sp)
  603.     movea.l    (F43GPTR,a6),a0
  604.     movea.l    (4,a0),a0        ;直前のレコード
  605.     moveq.l    #%01100,d0
  606.     and.b    (12,a0),d0
  607.     beq    f43g_fourth2        ;直前が3番目と4番目のいずれでもない
  608.     movea.l    (4,a0),a0        ;2つ前のレコード
  609.     btst.b    d7,(13,a0)        ;2つ前のレジスタ番号と比較
  610.     beq    f43g_fourth2        ;レジスタ番号が異なる
  611.     movea.l    (F43GPTR,a6),a0
  612.     add.b    d0,d0
  613.     or.b    d0,(12,a0)        ;4番目または5番目に該当する
  614. ;    bset.b    d7,13(a0)        ;レジスタ番号(不要)
  615. f43g_fourth2:
  616.     movea.l    (sp)+,a0
  617. f43g_fourth1:
  618.     rts
  619.  
  620. ;----------------------------------------------------------------
  621. ;    浮動小数点実効アドレスに必要なデータを出力する
  622. ;    in :a1=実効アドレス解釈バッファへのポインタ
  623. ;    out:---
  624. fpeadataout:
  625. ;d7.wにDSPOPOUTで出力した命令コード(1ワード目)が残っていること
  626.     bsr    f43g_fourth        ;4番目のチェック
  627.     moveq.l    #0,d0
  628.     move.b    (EADTYPE,a1),d0
  629.     beq    fpead_reg        ;レジスタ直接
  630.     add.w    d0,d0
  631.     move.w    (fpeajmp_tbl,pc,d0.w),d0
  632.     move.l    (RPNBUF1,a1),d1
  633.     tst.w    (RPNLEN1,a1)
  634.     jmp    (fpeajmp_tbl,pc,d0.w)
  635.  
  636. fpeajmp_tbl:
  637.     .dc.w    fpead_reg-fpeajmp_tbl    ;Dn/An
  638.     .dc.w    ead_none-fpeajmp_tbl    ;(An)/(An)+/-(An)
  639.     .dc.w    ead_dspadr-fpeajmp_tbl    ;(d,An)
  640.     .dc.w    ead_idxadr-fpeajmp_tbl    ;(d,An,Rn)
  641.     .dc.w    ead_bdadr-fpeajmp_tbl    ;(bd,An,Rn)
  642.     .dc.w    ead_memadr-fpeajmp_tbl    ;([bd,An,Rn],od)
  643.     .dc.w    ead_dsppc-fpeajmp_tbl    ;(d,PC)
  644.     .dc.w    ead_idxpc-fpeajmp_tbl    ;(d,PC,Rn)
  645.     .dc.w    ead_bdpc-fpeajmp_tbl    ;(bd,PC,Rn)
  646.     .dc.w    ead_mempc-fpeajmp_tbl    ;([bd,PC,Rn],od)
  647.     .dc.w    ead_abslw-fpeajmp_tbl    ;xxxx.l/xxxx.w
  648.     .dc.w    fpead_imm-fpeajmp_tbl    ;#xxxx
  649.  
  650. ;----------------------------------------------------------------
  651. fpead_reg:                ;Dn/An
  652.     cmpi.b    #SZ_SHORT,(CMDOPSIZE,a6)
  653.     bhi    ilsizeerr        ;サイズが.d/.x/.p/省略ならエラー
  654.     rts
  655.  
  656. ;----------------------------------------------------------------
  657. fpead_imm:                ;#xxxx 浮動小数点データを出力する
  658.     move.b    (CMDOPSIZE,a6),d0
  659.     cmp.b    #SZ_SINGLE,d0
  660.     bcs    ead_imm0        ;扱うデータが整数の場合
  661.     bsr    getfplen        ;データ長を得る
  662.     move.w    d1,d3            ;データ長-1
  663.     move.b    (EAIMMCNT,a1),d0
  664.     bmi    fpead_imm2        ;浮動小数点実数表記の場合
  665.     cmp.b    d3,d0
  666.     bne    iloprerr        ;内部表記のサイズが合わない
  667. fpead_imm2:
  668. ;#xxxxでサイズが.xまたは.pのときソフトウェアエミュレーション
  669.     cmp.b    #2,d3
  670.     bne    fpead_imm3
  671.     move.w    (CPUTYPE,a6),d0
  672.     and.w    #C040|C060,d0
  673.     beq    fpead_imm4
  674.     and.w    (SOFTFLAG,a6),d0
  675.     bne    fpead_imm4
  676.     bsr    softwarn
  677. fpead_imm4:
  678.     ori.w    #C040|C060,(SOFTFLAG,a6)
  679. fpead_imm3:
  680.     movea.l    a1,a2
  681.     lea.l    (RPNBUF1,a2),a1
  682.     bsr    fpead_immout        ;.s/.d/.x/.p
  683.     subq.b    #1,d3
  684.     bcs    fpead_imm9
  685.     lea.l    (RPNBUF2,a2),a1
  686.     bsr    fpead_immout        ;.d/.x/.p
  687.     subq.b    #1,d3
  688.     bcs    fpead_imm9
  689.     lea.l    (RPNBUFEX,a6),a1
  690.     bra    fpead_immout        ;.x/.p
  691.  
  692. fpead_imm9:
  693.     rts
  694.  
  695. fpead_immout:
  696.     move.w    (RPNLEN1-RPNBUF1,a1),d1
  697.     bmi    fpead_immout5
  698.     addq.l    #4,(LOCATION,a6)    ;式の場合
  699.     moveq.l    #SZ_LONG,d0
  700.     bra    wrtrpn
  701.  
  702. fpead_immout5:                ;定数の場合
  703.     move.l    (a1),d0
  704.     bra    wrt1lobj
  705.  
  706.  
  707. ;----------------------------------------------------------------
  708. ;    テンポラリデータの出力
  709. ;----------------------------------------------------------------
  710.  
  711. ;----------------------------------------------------------------
  712. ;    テンポラリにイミディエイトデータオブジェクトを出力する
  713. ;    in :d0.b=サイズ/d1.l=データ
  714. ;    out:---
  715. wrtimm::
  716.     move.b    d0,d2
  717.     bsr    chkdtsize
  718.     move.l    d1,d0
  719.     cmp.b    #SZ_SHORT,d2
  720.     beq    wrt1bobj        ;.s
  721.     cmp.b    #SZ_LONG,d2
  722.     bne    wrt1wobj        ;.b/.w
  723.     bra    wrt1lobj        ;.l
  724.  
  725. ;----------------------------------------------------------------
  726. ;    データが各サイズの範囲内かどうかを調べる
  727. ;    in :d1.l=データ/d2.b=サイズ
  728. ;    out:---
  729. chkdtsize::
  730.     and.b    #$03,d2
  731.     move.l    d1,d0
  732.     cmp.b    #SZ_LONG,d2
  733.     beq    chkdtsize2        ;.l
  734.     cmp.b    #SZ_WORD,d2
  735.     beq    chkdtsize1        ;.w
  736.     ext.w    d0            ;.b/.s(実際には.dc.bで使用される)
  737.     ext.l    d0
  738.     cmp.l    d1,d0
  739.     beq    chkdtsize2        ;-$80~$7F
  740.     cmp.l    #$00000100,d1
  741.     bcc    overflowerr        ;$100以上
  742.     rts
  743.  
  744. chkdtsize1:                ;.w
  745.     ext.l    d0
  746.     cmp.l    d1,d0
  747.     beq    chkdtsize2        ;-$8000~$7FFF
  748.     cmp.l    #$00010000,d1
  749.     bcc    overflowerr        ;$10000以上
  750. chkdtsize2:
  751.     rts
  752.  
  753. ;----------------------------------------------------------------
  754. ;    逆ポーランド式をファイルに出力する
  755. ;    in :a1=逆ポーランド式へのポインタ
  756. ;        d0.b=値のサイズ/d1.w=逆ポーランド式のワード数
  757. ;    out:---
  758. wrtrpn::
  759.     and.w    #$00FF,d0
  760.     cmp.w    #3,d1
  761.     bne    wrtrpn1
  762.     cmp.w    #RPN_SYMBOL,(a1)
  763.     bne    wrtrpn1
  764.     or.w    #T_SYMBOL,d0        ;シンボルのみの場合
  765.     bsr    wrtobjd0w
  766.     move.l    (2,a1),d0        ;シンボルへのポインタ
  767.     bra    wrtd0l
  768.  
  769. wrtrpn1:                ;逆ポーランド式を出力
  770.     or.w    #T_RPN,d0
  771.     bsr    wrtobjd0w
  772.     subq.w    #1,d1            ;(エンドコード$0000は出力しない)
  773.     move.w    d1,d0
  774.     bsr    wrtd0w            ;式の長さ
  775. wrtrpn2:
  776.     move.w    (a1)+,d0
  777.     bsr    wrtd0w
  778.     dbra    d1,wrtrpn2
  779.     rts
  780.  
  781. ;----------------------------------------------------------------
  782. ;    命令のオペレーションサイズを得る
  783. getopsize:
  784.     moveq.l    #0,d0
  785.     move.b    (CMDOPSIZE,a6),d0
  786.     bpl    getopsize9
  787.     moveq.l    #SZ_WORD,d0        ;省略時は.w
  788.     move.b    d0,(CMDOPSIZE,a6)
  789. getopsize9:
  790.     rts
  791.  
  792. ;----------------------------------------------------------------
  793. ;    オペレーションサイズを命令コードのフィールドb7-b6にセット
  794. setopsize:
  795.     moveq.l    #0,d0
  796.     move.b    (CMDOPSIZE,a6),d0
  797.     bpl    setopsize9
  798.     moveq.l    #SZ_WORD,d0        ;省略時は.w
  799.     move.b    d0,(CMDOPSIZE,a6)
  800. setopsize9:
  801.     ror.b    #2,d0
  802.     or.w    d0,d7
  803.     rts
  804.  
  805. ;----------------------------------------------------------------
  806. ;    浮動小数点オペレーションサイズをコプロセッサ命令ワードにセット
  807. setfpopsize:
  808.     moveq.l    #0,d0
  809.     move.b    (CMDOPSIZE,a6),d0
  810.     bpl    setfpopsize9
  811.     moveq.l    #SZ_EXTEND,d0        ;省略時は.x
  812.     move.b    d0,(CMDOPSIZE,a6)
  813. setfpopsize9:
  814.     add.w    d0,d0
  815.     or.w    (setfpop_tbl,pc,d0.w),d6
  816. ;.pは68040,68060ではソフトウェアエミュレーション
  817.     cmpi.b    #SZ_PACKED,(CMDOPSIZE,a6)
  818.     bne    setfpopsize10
  819.     ori.w    #C040|C060,(SOFTFLAG,a6)
  820. setfpopsize10:
  821.     rts
  822.  
  823. setfpop_tbl:                ;サイズコードテーブル
  824.     .dc.w    $1800,$1000,$0000,$0400,$1400,$0800,$0C00
  825.  
  826.  
  827. ;----------------------------------------------------------------
  828. ;    命令のアセンブル処理
  829. ;----------------------------------------------------------------
  830.  
  831. ;----------------------------------------------------------------
  832. ;    illegal/nop/reset/rte/rtr/rts/trapv    (オペランドを持たない命令)
  833. ~noopr::
  834.     OPOUT
  835.     addq.l    #asm1skipofst,(sp)    ;行末のチェックは行わない
  836.     rts
  837.  
  838. ;----------------------------------------------------------------
  839. ;    ext    Dn
  840. ~ext::
  841.     bsr    getdreg            ;データレジスタオペランドを得る
  842.     bmi    iladrerr
  843.     SETREGL
  844.     bsr    getopsize        ;サイズを得る
  845.     addq.w    #1,d0
  846.     ror.b    #2,d0
  847.     or.w    d0,d7            ;b8-b6:.w=%010/.l=%011
  848.     OPOUTrts
  849.  
  850. ;----------------------------------------------------------------
  851. ;    extb    Dn
  852. ~extb::
  853.     bsr    getdreg            ;データレジスタオペランドを得る
  854.     bmi    iladrerr
  855.     SETREGL
  856.     OPOUTrts
  857.  
  858. ;----------------------------------------------------------------
  859. ;    swap    Dn
  860. ~swap::
  861.     bsr    getdreg            ;データレジスタオペランドを得る
  862.     bmi    iladrerr
  863.     SETREGL
  864.     OPOUTrts
  865.  
  866. ;----------------------------------------------------------------
  867. ;    unlk    An
  868. ~unlk::
  869.     bsr    getareg            ;アドレスレジスタオペランドを得る
  870.     bmi    iladrerr
  871.     SETREGL
  872.     OPOUTrts
  873.  
  874. ;----------------------------------------------------------------
  875. ;    exg    Rn,Rn
  876. ~exg::
  877.     bsr    getreg            ;レジスタオペランドを得る
  878.     bmi    iladrerr
  879.     move.w    d1,d6
  880.     CHKLIM
  881.     bsr    getreg            ;レジスタオペランドを得る
  882.     bmi    iladrerr
  883.     cmpi.w    #REG_A0,d6
  884.     bcc    ~exg1
  885.     cmpi.b    #REG_A0,d1
  886.     bcc    ~exg3
  887.     or.w    #$0040,d7        ;Dn,Dn
  888.     bra    ~exg9
  889.  
  890. ~exg1:
  891.     cmpi.b    #REG_A0,d1
  892.     bcs    ~exg2
  893.     or.w    #$0048,d7        ;An,An
  894.     bra    ~exg9
  895.  
  896. ~exg2:                    ;An,Dn
  897.     exg.l    d1,d6
  898. ~exg3:                    ;Dn,An
  899.     or.w    #$0088,d7
  900. ~exg9:
  901.     SETREGL
  902.     move.w    d6,d1
  903.     SETREGH
  904.     OPOUTrts
  905.  
  906. ;----------------------------------------------------------------
  907. ;    or/and    Dn,<ea>/<ea>,Dn
  908. ~orand::
  909.     movea.l    a4,a1
  910.     bsr    geteamode        ;実効アドレスオペランドを得る
  911.     move.w    d0,d6
  912.     and.w    #EG_DATA,d0        ;データモード
  913.     beq    iladrerr
  914.     CHKLIM
  915.     bsr    getdreg            ;データレジスタオペランドを得る
  916.     bne    ~orand5
  917.     SETREGH                ;<ea>,Dn
  918.     bsr    setopsize        ;オペレーションサイズのセット
  919.     or.w    (EACODE,a1),d7
  920.     DSPOPOUT
  921.     bra    eadataout
  922.  
  923. ~orand5:
  924.     cmp.w    #EA_IMM,d6        ;#xx,<ea>
  925.     beq    ~orand_i
  926.     cmp.w    #EA_DN,d6
  927.     bne    iladrerr
  928.     ori.w    #$0100,d7        ;Dn,<ea>
  929.     move.w    (EACODE,a1),d1
  930.     SETREGH
  931.     movea.l    a4,a1
  932.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  933.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  934.     beq    iladrerr
  935.     bsr    setopsize        ;オペレーションサイズのセット
  936.     or.w    (EACODE,a1),d7
  937.     bsr    f43g_fifth        ;5番目のチェック
  938.     DSPOPOUT
  939.     bra    eadataout
  940.  
  941. ~orand_i:                ;or/and #xx,<ea> → ori/andi
  942.     lsr.w    #5,d7
  943.     andi.w    #$0200,d7
  944.     bra    ~orandeori1
  945.  
  946. ;----------------------------------------------------------------
  947. ;    eor    Dn,<ea>
  948. ~eor::
  949.     bsr    getdreg            ;データレジスタオペランドを得る
  950.     bmi    ~eor_i
  951.     SETREGH
  952.     CHKLIM
  953.     movea.l    a4,a1
  954.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  955.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  956.     beq    iladrerr
  957.     bsr    setopsize        ;オペレーションサイズのセット
  958.     or.w    (EACODE,a1),d7
  959.     bsr    f43g_fifth        ;5番目のチェック
  960.     DSPOPOUT
  961.     bra    eadataout
  962.  
  963. ~eor_i:                    ;eor #xx,<ea> → eori
  964.     move.w    #$0A00,d7
  965. ;    bra    ~orandeori
  966.  
  967. ;----------------------------------------------------------------
  968. ;    ori/andi/eori    #xx,<ea>/#xx,CCR/#xx,SR
  969. ~orandeori::
  970.     movea.l    a4,a1
  971.     bsr    geteamode        ;実効アドレスオペランドを得る
  972.     cmp.w    #EA_IMM,d0
  973.     bne    iladrerr        ;#xxでなければエラー
  974.     CHKLIM
  975. ~orandeori1:
  976.     move.w    (a0),d0
  977.     cmp.w    #REG_CCR|OT_REGISTER,d0
  978.     beq    ~orandeori_ccr        ;ori/andi/eori to CCR
  979.     cmp.w    #REG_SR|OT_REGISTER,d0
  980.     beq    ~orandeori_sr        ;ori/andi/eori to SR
  981.     movea.l    a5,a1
  982.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  983.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  984.     beq    iladrerr
  985. ;ori/andi/eori/or #imm/and #imm
  986.     tst.b    (CPUTYPE2,a6)
  987.     beq    ~orandeori11
  988.     and.w    #EA_DN,d0
  989.     beq    iladrerr
  990. ~orandeori11:
  991.     bsr    setopsize        ;オペレーションサイズのセット
  992.     or.w    (EACODE,a1),d7
  993.     bsr    f43g_fifth        ;5番目のチェック
  994.     DSPOPOUT
  995.     movea.l    a4,a1
  996.     bsr    eadataout
  997.     movea.l    a5,a1
  998.     bra    eadataout
  999.  
  1000. ~orandeori_ccr:                ;#xx,CCR
  1001.     move.b    (CMDOPSIZE,a6),d0
  1002.     bmi    ~orandeori_ccr1        ;サイズが省略された
  1003. ;    cmp.b    #SZ_BYTE,d0        ;上でd0.bにmove.bした直後なのでtst.bは不要
  1004.     bne    ilsizeerr_ccr
  1005. ~orandeori_ccr1:
  1006.     clr.b    (CMDOPSIZE,a6)        ;move.b #SZ_BYTE,(CMDOPSIZE,a6)
  1007.     tst.w    (RPNLEN1,a1)
  1008.     bpl    ~orandeori_sr1        ;定数でない
  1009.     move.w    #$00E0,d1        ;未定義のビットが1
  1010.     cmp.w    #$0200,d7        ;andi to ccr
  1011.     beq    ~orandeori_sr04
  1012.     bra    ~orandeori_sr03
  1013.  
  1014. ~orandeori_sr:                ;#xx,SR
  1015.     bsr    getopsize        ;サイズを得る
  1016.     cmp.b    #SZ_WORD,d0
  1017.     bne    ilsizeerr_sr        ;.wのみ
  1018.     ori.w    #$0040,d7
  1019.     tst.w    (RPNLEN1,a1)
  1020.     bpl    ~orandeori_sr1        ;定数でない
  1021.     move.w    #$08E0,d1        ;未定義のビットが1
  1022. ;000~010にはMがない
  1023.     move.w    #C020|C030|C040|C060|C520|C530|C540,d0
  1024.     and.w    (CPUTYPE,a6),d0
  1025.     bne    ~orandeori_sr01
  1026.     or.w    #$1000,d1        ;000~010にはMがない
  1027. ~orandeori_sr01:
  1028.     and.w    #C020|C030|C040,d0
  1029.     bne    ~orandeori_sr02
  1030.     or.w    #$4000,d1        ;000~010と060とColdFireにはT0がない
  1031. ~orandeori_sr02:
  1032. ;d1.w:未定義のビットが1
  1033.     cmp.w    #$0240,d7        ;andi to sr
  1034.     beq    ~orandeori_sr04
  1035. ~orandeori_sr03:
  1036.     and.w    (RPNBUF1+2,a1),d1
  1037.     beq    ~orandeori_sr1
  1038.     bra    ~orandeori_sr05
  1039.  
  1040. ~orandeori_sr04:
  1041.     not.w    d1
  1042.     or.w    (RPNBUF1+2,a1),d1
  1043.     not.w    d1
  1044.     beq    ~orandeori_sr1
  1045. ~orandeori_sr05:
  1046.     bsr    insigbitwarn
  1047. ~orandeori_sr1:
  1048.     ori.w    #EAC_IMM,d7
  1049.     addq.l    #2,a0
  1050.     OPOUT
  1051.     bra    eadataout
  1052.  
  1053. ;----------------------------------------------------------------
  1054. ;    cmpm    (An)+,(An)+
  1055. ~cmpm::
  1056.     movea.l    a4,a1
  1057.     bsr    geteamode        ;実効アドレスオペランドを得る
  1058.     cmp.w    #EA_INCADR,d0
  1059.     bne    iladrerr        ;(An)+でなければエラー
  1060.     CHKLIM
  1061. ~cmpm1:
  1062.     movea.l    a5,a1
  1063.     bsr    geteamode        ;実効アドレスオペランドを得る
  1064.     cmp.w    #EA_INCADR,d0
  1065.     bne    iladrerr        ;(An)+でなければエラー
  1066.     move.w    (EACODE,a4),d1
  1067.     SETREGL
  1068.     move.w    (EACODE,a5),d1
  1069.     SETREGH
  1070.     bsr    setopsize        ;オペレーションサイズのセット
  1071.     movea.l    a4,a1
  1072.     bsr    f43g_fifthadr        ;5番目のチェック
  1073.     movea.l    a5,a1
  1074.     bsr    f43g_fifthadr        ;5番目のチェック
  1075.     OPOUTrts
  1076.  
  1077. ;----------------------------------------------------------------
  1078. ;    cmp    <ea>,Dn
  1079. ~cmp::
  1080. ;5200/5300はcmp.b/cmp.w/cmpa.w/cmpi.b/cmpi.w不可
  1081.     move.w    #C520|C530,d0
  1082.     and.w    (CPUTYPE,a6),d0
  1083.     beq    ~cmp00
  1084.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  1085.     bne    ilsizeerr_cf_long    ;サイズ省略時もエラー
  1086. ~cmp00:
  1087.     movea.l    a4,a1
  1088.     bsr    geteamode        ;実効アドレスオペランドを得る
  1089.     move.w    d0,d6            ;(すべてのモード)
  1090.     CHKLIM
  1091.     bsr    getdreg            ;データレジスタオペランドを得る
  1092.     bmi    ~cmp_cnv
  1093.     SETREGH
  1094.     bsr    setopsize        ;オペレーションサイズのセット
  1095.     tst.b    (OPTCMP0,a6)
  1096.     beq    ~cmp99            ;CMP#0の最適化に対応しない
  1097.     cmpi.w    #%111_100,(EACODE,a1)
  1098.     bne    ~cmp99            ;#immでないので最適化できない
  1099.     tst.b    (RPNSIZE1,a1)
  1100.     bpl    ~cmp99            ;#immにサイズ指定があるので最適化しない
  1101.     tst.w    (RPNLEN1,a1)
  1102.     bpl    ~cmp99            ;#immが定数でないので最適化できない
  1103.     tst.l    (RPNBUF1,a1)
  1104.     bne    ~cmp99            ;#immが0でないので最適化できない
  1105.     move.w    d7,d0
  1106.     and.w    #$00C0,d0        ;サイズ
  1107.     and.w    #$0E00,d7        ;レジスタ番号
  1108.     rol.w    #7,d7
  1109.     or.w    d7,d0
  1110.     or.w    #$4A00,d0        ;TST.bwl Dn
  1111.     bra    wrt1wobj
  1112.  
  1113. ~cmp99:
  1114.     or.w    (EACODE,a1),d7
  1115.     bsr    f43g_fifth        ;5番目のチェック
  1116.     DSPOPOUT
  1117.     bra    eadataout
  1118.  
  1119. ~cmp_cnv:                ;cmp → cmpm/cmpa/cmpi
  1120.     bsr    getareg            ;アドレスレジスタオペランドを得る
  1121.     beq    ~cmp_a
  1122.     cmp.w    #EA_IMM,d6
  1123.     beq    ~cmp_i
  1124.     cmp.w    #EA_INCADR,d6
  1125.     beq    ~cmp_m
  1126.     bra    iladrerr
  1127.  
  1128. ~cmp_a:                    ;cmp <ea>,An → cmpa
  1129.     tst.b    (CMDOPSIZE,a6)        ;cmpi.b #SZ_BYTE,(CMDOPSIZE,a6)
  1130.     beq    ilsizeerr_an        ;.bならエラー
  1131.     move.w    #$B0C0,d7
  1132.     bra    ~sbadcpa1
  1133.  
  1134. ~cmp_i:                    ;cmp #xx,<ea> → cmpi
  1135.     move.w    #$0C00,d7
  1136.     bra    ~cmpi1
  1137.  
  1138. ~cmp_m:                    ;cmp (An)+,(An)+ → cmpm
  1139.     move.w    #$B108,d7
  1140.     bra    ~cmpm1
  1141.  
  1142. ;----------------------------------------------------------------
  1143. ;    sub/add    Dn,<ea>/<ea>,Dn
  1144. ~subadd::
  1145.     movea.l    a4,a1
  1146.     bsr    geteamode        ;実効アドレスオペランドを得る
  1147.     move.w    d0,d5
  1148.     CHKLIM
  1149.     movea.l    a5,a1
  1150.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  1151.     move.w    d0,d6
  1152.     cmp.w    #EA_IMM,d5
  1153.     beq    ~subadd_q
  1154. ~subadd1:
  1155.     cmp.w    #EA_DN,d6
  1156.     beq    ~subadd5
  1157.     cmp.w    #EA_AN,d6
  1158.     beq    ~subadd_a
  1159.     and.w    #EG_MEM&EG_ALT,d6    ;メモリ・可変モード
  1160.     beq    iladrerr
  1161.     cmp.w    #EA_DN,d5
  1162.     bne    ~subadd_i
  1163.     or.w    #$0100,d7        ;Dn,<ea>
  1164.     move.w    (EACODE,a4),d1
  1165.     SETREGH
  1166.     bsr    setopsize        ;オペレーションサイズのセット
  1167.     or.w    (EACODE,a1),d7
  1168.     bsr    f43g_fifth        ;5番目のチェック
  1169.     DSPOPOUT
  1170.     bra    eadataout
  1171.  
  1172. ~subadd5:                ;<ea>,Dn
  1173.     move.w    (EACODE,a5),d1
  1174.     SETREGH
  1175.     bsr    setopsize        ;オペレーションサイズのセット
  1176.     movea.l    a4,a1
  1177.     or.w    (EACODE,a1),d7
  1178.     bsr    f43g_fifth        ;5番目のチェック
  1179.     DSPOPOUT
  1180.     bra    eadataout
  1181.  
  1182. ~subadd_q:                ;#xx,<ea>
  1183.     tst.b    (NOQUICK,a6)
  1184.     bmi    ~subadd1        ;クイックイミディエイト変換はしない
  1185.     tst.w    (RPNLEN1,a4)
  1186.     bpl    ~subadd1        ;イミディエイト値が得られない
  1187.     tst.b    (RPNSIZE1,a4)
  1188.     bpl    ~subadd1        ;サイズが指定されている
  1189.     move.l    (RPNBUF1,a4),d0
  1190.     beq    ~subadd1
  1191.     cmp.l    #8,d0
  1192.     bhi    ~subadd1
  1193.     not.w    d7            ;sub/add #1~8,<ea> → subq/addq
  1194.     lsr.w    #6,d7
  1195.     and.w    #$0100,d7
  1196.     or.w    #$5000,d7
  1197.     move.w    d6,d0
  1198.     bra    ~subaddq1
  1199.  
  1200. ~subadd_a:                ;sub/add <ea>,An → suba/adda
  1201.     tst.b    (CMDOPSIZE,a6)        ;cmpi.b #SZ_BYTE,(CMDOPSIZE,a6)
  1202.     beq    ilsizeerr_an        ;.bならエラー
  1203.     or.w    #$00C0,d7
  1204.     move.w    (EACODE,a5),d1
  1205.     movea.l    a4,a1
  1206.     bra    ~sbadcpa1
  1207.  
  1208. ~subadd_i:                ;sub/add #xx,<ea> → subi/addi
  1209.     cmp.w    #EA_IMM,d5
  1210.     bne    iladrerr
  1211.     lsr.w    #5,d7
  1212.     and.w    #$0200,d7
  1213.     or.w    #$0400,d7
  1214.     move.w    d6,d0
  1215.     bra    ~subaddi1
  1216.  
  1217. ;----------------------------------------------------------------
  1218. ;    suba/adda/cmpa    <ea>,An
  1219. ;5200/5300はcmp.b/cmp.w/cmpa.w/cmpi.b/cmpi.w不可
  1220. ~cmpa::
  1221.     move.w    #C520|C530,d0
  1222.     and.w    (CPUTYPE,a6),d0
  1223.     beq    ~sbadcpa
  1224.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  1225.     bne    ilsizeerr_cf_long    ;サイズ省略時もエラー
  1226. ;    bra    ~sbadcpa
  1227.  
  1228. ~sbadcpa::
  1229.     movea.l    a4,a1
  1230.     bsr    geteamode        ;実効アドレスオペランドを得る
  1231.     CHKLIM
  1232.     bsr    getareg            ;アドレスレジスタオペランドを得る
  1233.     bmi    iladrerr
  1234. ~sbadcpa1:
  1235.     SETREGH
  1236.     cmpi.w    #%111_100,(EACODE,a1)
  1237.     bne    ~sbadcpa199        ;#immでないので最適化できない
  1238.     tst.b    (RPNSIZE1,a1)
  1239.     bpl    ~sbadcpa199        ;#immにサイズ指定があるので最適化しない
  1240.     tst.w    (RPNLEN1,a1)
  1241.     bpl    ~sbadcpa199        ;定数でないので最適化できない
  1242.     btst.l    #13,d7
  1243.     bne    ~sbadcpa1cp        ;CMPA
  1244. ;ADDA/SUBA
  1245.     tst.b    (OPTADDASUBA,a6)
  1246.     beq    ~sbadcpa199        ;ADDA/SUBAの最適化に対応しない
  1247.     move.l    (RPNBUF1,a1),d0
  1248.     beq    ~sbadcpa1zero        ;imm=0
  1249.     btst.l    #14,d7
  1250.     beq    ~sbadcpa1sb        ;SUBA
  1251. ;ADDA
  1252. ~sbadcpa1ad:
  1253.     moveq.l    #8,d1
  1254.     cmp.l    d1,d0
  1255.     bgt    ~sbadcpa1adw
  1256.     tst.l    d0
  1257.     bpl    ~sbadcpa1adq
  1258.     moveq.l    #-8,d1
  1259.     cmp.l    d1,d0
  1260.     blt    ~sbadcpa1adw
  1261.     neg.l    d0
  1262. ;ADDA/SUBA→SUBQ
  1263. ~sbadcpa1sbq:
  1264.     move.w    #$5148,d1        ;SUBQ.W #imm,An
  1265.     bra    ~sbadcpa1q
  1266.  
  1267. ~sbadcpa1zero:
  1268. ;imm=0
  1269.     rts
  1270.  
  1271. ;ADDA.L #$00008000,An/SUBA.L #$FFFF8000,An→SUBA.W #$8000,An
  1272. ~sbadcpa18000:
  1273.     and.w    #$0E00,d7
  1274.     move.w    d7,d0
  1275.     or.w    #$90FC,d0        ;SUBA.W #imm,An
  1276.     bsr    wrt1wobj
  1277.     move.w    #$8000,d0
  1278.     bra    wrt1wobj
  1279.  
  1280. ;ADDA→LEA
  1281. ~sbadcpa1adw:
  1282.     move.l    (RPNBUF1,a1),d1
  1283.     bra    ~sbadcpa1w
  1284.  
  1285. ;SUBA→LEA
  1286. ~sbadcpa1sbw:
  1287.     moveq.l    #0,d1
  1288.     sub.l    (RPNBUF1,a1),d1
  1289. ;ADDA/SUBA→LEA
  1290. ~sbadcpa1w:
  1291.     cmp.l    #$00008000,d1
  1292.     beq    ~sbadcpa18000
  1293.     move.l    d1,d0
  1294.     ext.l    d1
  1295.     cmp.l    d0,d1
  1296.     bne    ~sbadcpa199
  1297.     move.w    #$41E8,d0        ;LEA.L (d16,An),An
  1298.     and.w    #$0E00,d7
  1299.     or.w    d7,d0
  1300.     rol.w    #7,d7
  1301.     or.w    d7,d0
  1302.     bsr    wrt1wobj
  1303.     move.w    d1,d0
  1304.     bra    wrt1wobj
  1305.  
  1306. ~sbadcpa1sb:
  1307. ;SUBA
  1308.     moveq.l    #8,d1
  1309.     cmp.l    d1,d0
  1310.     bgt    ~sbadcpa1sbw
  1311.     tst.l    d0
  1312.     bpl    ~sbadcpa1sbq
  1313.     moveq.l    #-8,d1
  1314.     cmp.l    d1,d0
  1315.     blt    ~sbadcpa1sbw
  1316.     neg.w    d0
  1317. ;ADDA/SUBA→ADDQ
  1318. ~sbadcpa1adq:
  1319.     move.w    #$5048,d1        ;ADDQ.W #imm,An
  1320. ~sbadcpa1q:
  1321.     and.w    #$0007,d0        ;8→0
  1322.     ror.w    #7,d0            ;imm
  1323.     or.w    d1,d0
  1324.     and.w    #$0E00,d7
  1325.     rol.w    #7,d7            ;reg
  1326.     or.w    d7,d0
  1327.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)    ;.Lが指定されていなければワーニングを出す
  1328.     beq    wrt1wobj
  1329.     bsr    shortwarn
  1330.     bra    wrt1wobj
  1331.  
  1332. ~sbadcpa1cp:
  1333. ;CMPA
  1334.     tst.b    (OPTCMPA,a6)
  1335.     beq    ~sbadcpa199        ;CMPAの最適化に対応しない
  1336.                     ;CMPA.L #d16,Anの最適化も同時にスキップ
  1337.     move.l    (RPNBUF1,a1),d1
  1338.     bne    ~sbadcpa1cp1
  1339.     bra68    d0,~sbadcpa1cp1
  1340. ;ColdFireにもTST.wl Anはある
  1341. ;68020以上のときCMPA.{W|L} #0,An→TST.L An
  1342.     and.w    #$0E00,d7
  1343.     rol.w    #7,d7
  1344.     move.w    d7,d0            ;reg
  1345.     or.w    #$4A88,d0        ;TST.L An
  1346.     bra    wrt1wobj
  1347.  
  1348. ~sbadcpa1cp1:
  1349.     move.l    d1,d0
  1350.     ext.l    d1
  1351.     cmp.l    d0,d1
  1352.     bne    ~sbadcpa199        ;$FFFF8000≦imm≦$00007FFFでない
  1353.     tst.b    (OPTCMPA,a6)
  1354.     beq    ~sbadcpa199        ;CMPAの最適化に対応しない
  1355.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  1356.     bne    ~sbadcpa199        ;.Lでないので最適化できない
  1357.                     ;(サイズ省略時も.Wなので不可)
  1358.     move.b    #SZ_WORD,(CMDOPSIZE,a6)    ;{CMPA|SUBA}.L #imm,An
  1359.                     ;→{CMPA|SUBA}.W #imm,An
  1360.                     ;short addressingのワーニングは出さない
  1361.     bra    ~sbadcpa5
  1362.  
  1363. ~sbadcpa199:
  1364.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  1365.     beq    ~sbadcpa2
  1366.     move.b    #SZ_WORD,(CMDOPSIZE,a6)    ;.w
  1367.     btst.l    #13,d7
  1368.     bne    ~sbadcpa199cp        ;CMPA
  1369.     bsr    shortwarn
  1370.     bra    ~sbadcpa5
  1371.  
  1372. ~sbadcpa199cp
  1373.     bsr    shortwarn_cmpa
  1374.     bra    ~sbadcpa5
  1375.  
  1376. ~sbadcpa2:
  1377.     ori.w    #$0100,d7        ;.l
  1378. ~sbadcpa5:
  1379.     or.w    (EACODE,a1),d7
  1380.     bsr    f43g_fifth        ;5番目のチェック
  1381.     DSPOPOUT
  1382.     bra    eadataout
  1383.  
  1384. ;----------------------------------------------------------------
  1385. ;    cmpi    #xx,<ea>
  1386. ~cmpi::
  1387. ;5200/5300はcmp.b/cmp.w/cmpa.w/cmpi.b/cmpi.w不可
  1388.     move.w    #C520|C530,d0
  1389.     and.w    (CPUTYPE,a6),d0
  1390.     beq    ~cmpi00
  1391.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  1392.     bne    ilsizeerr_cf_long    ;サイズ省略時もエラー
  1393. ~cmpi00:
  1394.     movea.l    a4,a1
  1395.     bsr    geteamode        ;実効アドレスオペランドを得る
  1396.     cmp.w    #EA_IMM,d0
  1397.     bne    iladrerr        ;#xxでなければエラー
  1398.     CHKLIM
  1399. ~cmpi1:
  1400.     movea.l    a5,a1
  1401. ;ColdFireはcmpiでPC相対不可
  1402.     move.w    #C020|C030|C040|C060,d1
  1403.     and.w    (CPUTYPE,a6),d1
  1404.     bne    ~cmpi0
  1405.     st.b    (ABSLTOOPCCAN,a6)    ;cmpiは68000ではPC相対が使えない
  1406. ~cmpi0:
  1407.     bsr    geteamode        ;実効アドレスオペランドを得る
  1408.     bra68    d1,~cmpi050
  1409.     and.w    #EG_DATA&(.not.EA_IMM),d0    ;データモード(#xx以外)
  1410.     bra    ~cmpi051
  1411.  
  1412. ~cmpi050:
  1413.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  1414. ~cmpi051:
  1415.     beq    iladrerr
  1416. ;ColdFireはcmpi #immはdnのみ
  1417.     tst.b    (CPUTYPE2,a6)
  1418.     beq    ~cmpi052
  1419.     and.w    #EA_DN,d0
  1420.     beq    iladrerr
  1421. ~cmpi052:
  1422.     tst.b    (OPTCMPI0,a6)
  1423.     beq    ~subaddi2        ;CMPI#0の最適化に対応しない
  1424.     tst.b    (RPNSIZE1,a4)
  1425.     bpl    ~subaddi2        ;#immにサイズ指定があるので最適化しない
  1426.     tst.w    (RPNLEN1,a4)
  1427.     bpl    ~subaddi2        ;#immが定数でないので最適化できない
  1428.     tst.l    (RPNBUF1,a4)
  1429.     bne    ~subaddi2        ;#immが0でないので最適化できない
  1430.     bsr    setopsize        ;オペレーションサイズのセット
  1431.     or.w    (EACODE,a1),d7
  1432. ;CMPI.bwl #0,<ea>→TST.bwl <ea>
  1433.     eori.w    #$0C00.eor.$4A00,d7    ;CMPI→TST
  1434.     bsr    f43g_fifth        ;5番目のチェック
  1435.     DSPOPOUT
  1436.     movea.l    a5,a1
  1437.     bra    eadataout
  1438.  
  1439. ;----------------------------------------------------------------
  1440. ;    subi/addi    #xx,<ea>
  1441. ~subaddi::
  1442.     movea.l    a4,a1
  1443.     bsr    geteamode        ;実効アドレスオペランドを得る
  1444.     cmp.w    #EA_IMM,d0
  1445.     bne    iladrerr        ;#xxでなければエラー
  1446.     CHKLIM
  1447.     movea.l    a5,a1
  1448.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  1449. ~subaddi1:
  1450.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  1451.     beq    iladrerr
  1452. ;addi/subi/cmpi/add #imm/sub #imm/cmp #
  1453.     tst.b    (CPUTYPE2,a6)
  1454.     beq    ~subaddi11
  1455.     and.w    #EA_DN,d0
  1456.     beq    iladrerr
  1457. ~subaddi11:
  1458.     tst.b    (OPTSUBADDI0,a6)
  1459.     beq    ~subaddi2        ;SUBI/ADDI#0の最適化に対応しない
  1460.     tst.b    (RPNSIZE1,a4)
  1461.     bpl    ~subaddi2        ;#immにサイズ指定があるので最適化しない
  1462.     tst.w    (RPNLEN1,a4)
  1463.     bpl    ~subaddi2        ;#immが定数でないので最適化できない
  1464.     move.l    (RPNBUF1,a4),d0
  1465.     beq    ~subaddi2        ;#immが1~8でないので最適化できない(-8~-1はフラグ変化が違う)
  1466.     cmp.l    #8,d0
  1467.     bhi    ~subaddi2        ;#immが1~8でないので最適化できない(-8~-1はフラグ変化が違う)
  1468.     not.w    d7            ;SUBI/ADDI→SUBQ/ADDQ
  1469.     lsr.w    #1,d7
  1470.     and.w    #$0100,d7
  1471.     or.w    #$5000,d7
  1472.     bra    ~subaddq2
  1473.  
  1474. ~subaddi2:
  1475.     bsr    setopsize        ;オペレーションサイズのセット
  1476.     or.w    (EACODE,a1),d7
  1477.     bsr    f43g_fifth        ;5番目のチェック
  1478.     DSPOPOUT
  1479.     movea.l    a4,a1
  1480.     bsr    eadataout
  1481.     movea.l    a5,a1
  1482.     bra    eadataout
  1483.  
  1484. ~sftrot_imm:                ;<sftrot> #xx,Dn
  1485.     movea.l    a4,a1
  1486.     tst.w    (RPNLEN1,a1)
  1487.     bpl    ~subaddq_expr        ;式の値が未確定
  1488.     move.l    (RPNBUF1,a1),d1
  1489.     beq    ilsfterr
  1490.     cmp.l    #8,d1
  1491.     bhi    ilsfterr        ;1~8の範囲外
  1492.     bra    ~sftrot_imm_99
  1493.  
  1494. ~sftrot_expr:
  1495.     move.w    #T_CODERPN|TCR_IMM8S,d0    ;式の場合
  1496.     bra    ~subaddq_expr1
  1497.  
  1498. ;----------------------------------------------------------------
  1499. ;    subq/addq    #xx,<ea>
  1500. ~subaddq::
  1501.     movea.l    a4,a1
  1502.     bsr    geteamode        ;実効アドレスオペランドを得る
  1503.     cmp.w    #EA_IMM,d0
  1504.     bne    iladrerr        ;#xxでなければエラー
  1505.     CHKLIM
  1506.     movea.l    a5,a1
  1507.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  1508. ~subaddq1:
  1509.     and.w    #EG_ALT,d0        ;可変モード
  1510.     beq    iladrerr
  1511.     cmp.w    #EA_AN,d0
  1512.     bne    ~subaddq2
  1513.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  1514.     beq    ~subaddq2
  1515.     bsr    shortwarn
  1516. ~subaddq2:
  1517.     bsr    setopsize        ;オペレーションサイズのセット
  1518.     or.w    (EACODE,a1),d7
  1519.     movea.l    a4,a1
  1520.     tst.w    (RPNLEN1,a1)
  1521.     bpl    ~subaddq_expr        ;式の値が未確定
  1522.     move.l    (RPNBUF1,a1),d1
  1523.     beq    ilquickerr_addsubq
  1524.     cmp.l    #8,d1
  1525.     bhi    ilquickerr_addsubq    ;1~8の範囲外
  1526. ~sftrot_imm_99:
  1527.     SETREGH
  1528.     bsr    f43g_fifth        ;5番目のチェック
  1529.     DSPOPOUT
  1530.     movea.l    a5,a1
  1531.     bra    eadataout
  1532.  
  1533. ~subaddq_expr:
  1534.     move.w    #T_CODERPN|TCR_IMM8,d0    ;式の場合
  1535. ~subaddq_expr1:
  1536.     addq.l    #2,(LOCATION,a6)
  1537.     bsr    wrtobjd0w
  1538.     move.w    d7,d0
  1539.     bsr    wrtd0w
  1540.     moveq.l    #0,d0            ;(サイズは無関係)
  1541.     bsr    ead_outrpn
  1542.     movea.l    a5,a1
  1543.     bra    eadataout
  1544.  
  1545. ;----------------------------------------------------------------
  1546. ;    move    <ea>,<ea>/CCR,<ea>/<ea>,CCR/SR,<ea>/<ea>,SR/USP,An/An,USP
  1547. ~move::
  1548.     move.w    (a0),d0
  1549.     cmp.w    #REG_SR|OT_REGISTER,d0
  1550.     beq    ~move_frsr        ;move from SR
  1551.     cmp.w    #REG_CCR|OT_REGISTER,d0
  1552.     beq    ~move_frccr        ;move from CCR
  1553.     cmp.w    #REG_USP|OT_REGISTER,d0
  1554.     beq    ~move_frusp        ;move from USP
  1555.     tst.b    (CPUTYPE2,a6)
  1556.     beq    ~move000
  1557.     cmp.w    #REG_ACC|OT_REGISTER,d0
  1558.     beq    ~move_fracc        ;move from ACC
  1559.     cmp.w    #REG_MACSR|OT_REGISTER,d0
  1560.     beq    ~move_frmacsr        ;move from MACSR
  1561.     cmp.w    #REG_MASK|OT_REGISTER,d0
  1562.     beq    ~move_frmask        ;move from MASK
  1563. ~move000:
  1564.     movea.l    a4,a1
  1565.     bsr    geteamode        ;実効アドレスオペランドを得る
  1566.     move.w    d0,d6
  1567.     CHKLIM
  1568.     move.w    (a0),d0
  1569.     cmp.w    #REG_SR|OT_REGISTER,d0
  1570.     beq    ~move_tosr        ;move to SR
  1571.     cmp.w    #REG_CCR|OT_REGISTER,d0
  1572.     beq    ~move_toccr        ;move to CCR
  1573.     cmp.w    #REG_USP|OT_REGISTER,d0
  1574.     beq    ~move_tousp        ;move to USP
  1575.     tst.b    (CPUTYPE2,a6)
  1576.     beq    ~move001
  1577.     cmp.w    #REG_ACC|OT_REGISTER,d0
  1578.     beq    ~move_toacc        ;move to ACC
  1579.     cmp.w    #REG_MACSR|OT_REGISTER,d0
  1580.     beq    ~move_tomacsr        ;move to MACSR
  1581.     cmp.w    #REG_MASK|OT_REGISTER,d0
  1582.     beq    ~move_tomask        ;move to MASK
  1583. ~move001:
  1584.     movea.l    a5,a1
  1585.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  1586.     cmp.w    #EA_AN,d0
  1587.     beq    ~move_a            ;move <ea>,An
  1588.     cmp.w    #EA_IMM,d6
  1589.     beq    ~move_q            ;move #xx,<ea>
  1590. ~move1:
  1591.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  1592.     beq    iladrerr
  1593. ;move <src>,<dst>
  1594. ;move <src>,anは除外済み
  1595. ;<src>がdn/an/(an)/(an)+/-(an)ならば制約なし
  1596. ;<src>が(d16,an)/(d16,pc)ならば<dst>は(d8,an,xi)/xxx.w/xxx.l不可
  1597. ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#immならば<dst>は(d8,an,xi)/xxx.w/xxx.l不可
  1598. ;  5200/5300のとき(d16,an)も不可
  1599. ;  5400のとき(d16,an)はmove.l #imm,(d16,an)のときだけ不可
  1600. ;d6=<src>のアドレッシングモード
  1601. ;d0=<dst>のアドレッシングモード
  1602.     tst.b    (CPUTYPE2,a6)
  1603.     beq    ~move109
  1604. ;ColdFire
  1605.     move.w    d6,d7
  1606.     and.w    #EA_DN|EA_AN|EA_ADR|EA_INCADR|EA_DECADR,d7
  1607.     bne    ~move109        ;<src>がdn/an/(an)/(an)+/-(an)
  1608. ;<src>が(d16,an)/(d16,pc)/(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1609.     move.w    d0,d7
  1610.     and.w    #EA_IDXADR|EA_ABSW|EA_ABSL,d7
  1611.     bne    iladrerr        ;<src>が(d16,an)/(d16,pc)/(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1612.                     ;<dst>が(d8,an,xi)/xxx.w/xxx.l
  1613. ;<src>が(d16,an)/(d16,pc)/(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1614. ;<dst>がdn/(an)/(an)+/-(an)/(d16,an)
  1615.     move.w    d6,d7
  1616.     and.w    #EA_DSPADR|EA_DSPPC,d7
  1617.     bne    ~move109        ;<src>が(d16,an)/(d16,pc)
  1618.                     ;<dst>がdn/(an)/(an)+/-(an)/(d16,an)
  1619. ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1620. ;<dst>がdn/(an)/(an)+/-(an)/(d16,an)
  1621.     move.w    d0,d7
  1622.     and.w    #EA_DSPADR,d7
  1623.     beq    ~move109        ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1624.                     ;<dst>がdn/(an)/(an)+/-(an)
  1625. ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1626. ;<dst>が(d16,an)
  1627.     move.w    #C520|C530,d7
  1628.     and.w    (CPUTYPE,a6),d7
  1629.     bne    iladrerr        ;5200/5300
  1630.                     ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1631.                     ;<dst>が(d16,an)
  1632. ;5400
  1633. ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l/#imm
  1634. ;<dst>が(d16,an)
  1635.     move.w    d6,d7
  1636.     and.w    #EA_IMM,d7
  1637.     beq    ~move109        ;5400
  1638.                     ;<src>が(d8,an,xi)/(d8,pc,xi)/xxx.w/xxx.l
  1639.                     ;<dst>が(d16,an)
  1640. ;5400
  1641. ;<src>が#imm
  1642. ;<dst>が(d16,an)
  1643.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  1644.     beq    iladrerr        ;5400
  1645.                     ;move.l #imm,(d16,an)
  1646. ~move109:
  1647.     bsr    getopsize
  1648.     move.w    d0,d7
  1649.     beq    ~move2            ;.b
  1650.     eori.w    #$0003,d7
  1651. ~move2:
  1652.     addq.w    #1,d7            ;オペレーションサイズ .b:%01/.w:%11/.l:%10
  1653.     ror.w    #4,d7
  1654.     move.w    (EACODE,a5),d0        ;デスティネーション実効アドレス
  1655.     move.w    d0,d1
  1656.     and.w    #$0038,d0        ;モード
  1657.     and.w    #$0007,d1        ;レジスタ
  1658.     lsl.w    #3,d0
  1659.     ror.w    #7,d1
  1660.     or.w    d0,d7
  1661.     or.w    d1,d7
  1662.     or.w    (EACODE,a4),d7        ;ソース実効アドレス
  1663.     movea.l    a4,a1
  1664.     bsr    f43g_fifth        ;5番目のチェック(ソース)
  1665.     movea.l    a5,a1
  1666.     bsr    f43g_fifth        ;5番目のチェック(デスティネーション)
  1667.     DSPOPOUT
  1668.     movea.l    a4,a1
  1669.     bsr    eadataout        ;ソースのデータ
  1670.     st.b    (DSPADRDEST,a6)
  1671.     movea.l    a5,a1
  1672.     bsr    eadataout        ;デスティネーションのデータ
  1673.     sf.b    (DSPADRDEST,a6)
  1674.     rts
  1675.  
  1676. ~move_a:                ;move <ea>,An → movea
  1677.     tst.b    (CMDOPSIZE,a6)        ;cmpi.b #SZ_BYTE,(CMDOPSIZE,a6)
  1678.     beq    ilsizeerr_an        ;.bならエラー
  1679.     move.w    #$2040,d7
  1680.     move.w    (EACODE,a5),d1
  1681.     movea.l    a4,a1
  1682.     bra    ~movea1
  1683.  
  1684. ~move_q:                ;move.l #-$80~$7F,Dn → moveq
  1685.     cmp.w    #EA_DN,d0
  1686.     bne    ~move1
  1687.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  1688.     beq    ~move_q1        ;ロングならmoveqの変換へ
  1689. ;MOVE.bw #imm,Dn
  1690.     tst.b    (OPTMOVE0,a6)
  1691.     beq    ~move1            ;MOVE#0の最適化に対応しない
  1692.     tst.b    (RPNSIZE1,a4)
  1693.     bpl    ~move1            ;#immにサイズ指定があるので最適化しない
  1694.     tst.w    (RPNLEN1,a4)
  1695.     bpl    ~move1            ;#immが定数でないので最適化できない
  1696.     tst.l    (RPNBUF1,a4)
  1697.     bne    ~move1            ;#immが0でないので最適化できない
  1698. ;MOVE.bw #0,Dn
  1699.     moveq.l    #7,d0
  1700.     and.w    (EACODE,a5),d0        ;レジスタ
  1701.     tst.b    (CMDOPSIZE,a6)        ;cmpi.b #SZ_BYTE,(CMDOPSIZE,a6)
  1702.     beq    ~move_q0b
  1703.     or.w    #$0040,d0        ;.bでなければワード(サイズが省略された場合も含む)
  1704. ~move_q0b:
  1705.     or.w    #$4200,d0        ;CLR.bw Dn
  1706.     bra    wrt1wobj
  1707.  
  1708. ~move_q1:
  1709.     tst.b    (NOQUICK,a6)
  1710.     bmi    ~move1            ;クイックイミディエイト変換はしない
  1711.     tst.w    (RPNLEN1,a4)
  1712.     bpl    ~move1            ;イミディエイト値が得られない
  1713.     tst.b    (RPNSIZE1,a4)
  1714.     bpl    ~move1            ;サイズが指定されている
  1715.     move.l    (RPNBUF1,a4),d1
  1716.     move.l    d1,d2
  1717.     ext.w    d1
  1718.     ext.l    d1
  1719.     cmp.l    d1,d2
  1720.     bne    ~move1
  1721.     move.w    #$7000,d7
  1722.     move.w    (EACODE,a5),d1
  1723.     movea.l    a4,a1
  1724.     bra    ~moveq1
  1725.  
  1726. ~move_frsr:                ;move SR,<ea>
  1727.     move.w    #$40C0,d7
  1728.     bra    ~move_frccr1
  1729.  
  1730. ~move_frccr:                ;move CCR,<ea>
  1731. ;ColdFireにもMOVE from CCRはある
  1732.     move.w    (CPUTYPE,a6),d0
  1733.     and.w    #C000,d0
  1734.     bne    iladrerr        ;68000では使用できない
  1735.     move.w    #$42C0,d7
  1736. ~move_frccr1:
  1737.     addq.l    #2,a0
  1738.     CHKLIM
  1739.     movea.l    a4,a1
  1740.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  1741.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  1742.     beq    iladrerr
  1743. ;MOVE SR/CCR,Dx
  1744.     tst.b    (CPUTYPE2,a6)
  1745.     beq    ~move_frccr11
  1746.     and.w    #EA_DN,d0
  1747.     beq    iladrerr
  1748. ~move_frccr11:
  1749.     bsr    getopsize
  1750.     cmp.b    #SZ_WORD,d0
  1751.     bne    ilsizeerr_movefrsr
  1752.     or.w    (EACODE,a1),d7
  1753.     bsr    f43g_fifth        ;5番目のチェック
  1754.     DSPOPOUT
  1755.     bra    eadataout
  1756.  
  1757. ~move_tosr:                ;move <ea>,SR
  1758.     move.w    #$46C0,d7
  1759.     bra    ~move_tosrccr200
  1760.  
  1761. ~move_toccr:                ;move <ea>,CCR
  1762.     move.w    #$44C0,d7
  1763. ~move_tosrccr200:
  1764.     addq.l    #2,a0
  1765.     and.w    #EG_DATA,d6        ;データモード
  1766.     beq    iladrerr
  1767. ;MOVE Dx/#imm,SR/CCR
  1768.     tst.b    (CPUTYPE2,a6)
  1769.     beq    ~move_tosrccr2001
  1770.     and.w    #EA_DN|EA_IMM,d6    ;レジスタ番号注意
  1771.     beq    iladrerr
  1772. ~move_tosrccr2001:
  1773.     bsr    getopsize
  1774.     cmp.b    #SZ_WORD,d0
  1775.     bne    ilsizeerr_movetosr
  1776.     move.w    d6,d0
  1777.     and.w    #EA_IMM,d0
  1778.     beq    ~move_tosrccr209
  1779.     move.w    d7,d0            ;$44C0=ccr,$46C0=sr
  1780.     bsr    insigbitchk
  1781. ~move_tosrccr209:
  1782.     or.w    (EACODE,a1),d7
  1783.     bsr    f43g_fifth        ;5番目のチェック(ソース)
  1784.     DSPOPOUT
  1785.     bra    eadataout
  1786.  
  1787. ~move_frusp:                ;move USP,An
  1788.     move.w    #$4E68,d7
  1789.     addq.l    #2,a0
  1790.     CHKLIM
  1791.     bsr    getareg            ;アドレスレジスタオペランドを得る
  1792.     bmi    iladrerr
  1793. ~move_frusp1:
  1794.     SETREGL
  1795. ~move_frusp11:
  1796.     move.b    (CMDOPSIZE,a6),d0
  1797.     bmi    ~move_frusp2
  1798.     cmp.b    #SZ_LONG,d0
  1799.     bne    ilsizeerr_moveusp
  1800. ~move_frusp2:
  1801.     OPOUTrts
  1802.  
  1803. ~move_tousp:                ;move An,USP
  1804.     tst.b    (IGNORE_ERRATA,a6)
  1805.     bne    ~move_tousp0
  1806.     cmpi.b    #SECT_TEXT,(SECTION,a6)
  1807.     bne    ~move_tousp0
  1808.     bsr    deflabel        ;必要ならラベルを定義する
  1809.     move.w    #-1,(LABNAMELEN,a6)
  1810.     move.l    (LTOPLOC,a6),d0        ;行頭のロケーションカウンタ'*'
  1811.     cmp.l    (LASTSYMLOC,a6),d0    ;最後にラベル定義したロケーションカウンタ
  1812.     bne    ~move_tousp0
  1813.     move.w    #$2048,d0        ;MOVEA.L A0,A0
  1814.     bsr    wrt1wobj
  1815.     bsr    movetouspwarn
  1816. ~move_tousp0:
  1817.     move.w    #$4E60,d7
  1818.     addq.l    #2,a0
  1819.     cmp.w    #EA_AN,d6
  1820.     bne    iladrerr
  1821.     move.w    (EACODE,a1),d1
  1822.     bra    ~move_frusp1
  1823.  
  1824. ;move from ACC
  1825. ~move_fracc:
  1826.     move.w    #$A180,d7
  1827. ~move_fracc1:
  1828.     addq.l    #2,a0
  1829.     CHKLIM
  1830. ~move_fracc2:
  1831.     bsr    getreg            ;レジスタオペランドを得る
  1832.     bmi    iladrerr
  1833.     or.w    d1,d7
  1834.     bra    ~move_frusp11
  1835.  
  1836. ;move from MACSR
  1837. ~move_frmacsr:
  1838.     move.w    #$A980,d7
  1839.     addq.l    #2,a0
  1840.     CHKLIM
  1841.     cmpi.w    #REG_CCR|OT_REGISTER,(a0)
  1842.     bne    ~move_fracc2
  1843. ;move from MACSR to CCR
  1844.     move.w    #$A9C0,d7
  1845.     addq.l    #2,a0
  1846.     bra    ~move_frusp11
  1847.  
  1848. ;move from MASK
  1849. ~move_frmask:
  1850.     move.w    #$AD80,d7
  1851.     bra    ~move_fracc1
  1852.  
  1853. ;move to ACC
  1854. ~move_toacc:
  1855.     move.w    #$A100,d7
  1856. ~move_toacc1:
  1857.     addq.l    #2,a0
  1858.     and.w    #EA_DN|EA_AN|EA_IMM,d6
  1859.     beq    iladrerr
  1860.     move.b    (CMDOPSIZE,a6),d0
  1861.     bpl    ~move_toacc2
  1862.     moveq.l    #SZ_LONG,d0        ;省略時は.l
  1863.     move.b    d0,(CMDOPSIZE,a6)    ;#immがあるので必要
  1864. ~move_toacc2:
  1865.     cmp.b    #SZ_LONG,d0
  1866.     bne    ilsizeerr_cf_acc
  1867.     or.w    (EACODE,a1),d7
  1868.     OPOUT                ;(d16,an)/(d16,pc)はないのでDSPOPOUTでなくてよい
  1869.     bra    eadataout        ;#immがあるので必要
  1870.  
  1871. ;move to MACSR
  1872. ~move_tomacsr:
  1873.     move.w    #$A900,d7
  1874.     bra    ~move_toacc1
  1875.  
  1876. ;move to MASK
  1877. ~move_tomask:
  1878.     move.w    #$AD00,d7
  1879.     bra    ~move_toacc1
  1880.  
  1881. ;    MAC.wl Ry.ul,Rx.ul
  1882. ;    MAC.wl Ry.ul,Rx.ul,<<|>>
  1883. ;    MSAC.wl Ry.ul,Rx.ul
  1884. ;    MSAC.wl Ry.ul,Rx.ul,<<|>>
  1885. ~msac::
  1886.     move.w    #$0100,d6
  1887.     bra    ~mac1
  1888. ~mac::
  1889.     clr.w    d6
  1890. ~mac1:
  1891.     bsr    getreg            ;Ry
  1892.     bmi    iladrerr
  1893.     ror.b    #3,d1            ;0000000032100004
  1894.     lsl.w    #4,d1            ;0000321000040000
  1895.     lsl.b    #2,d1            ;0000321004000000
  1896.     or.w    d1,d7            ;Ry
  1897.     bsr    getul
  1898.     add.w    d1,d1            ;bit6→bit7
  1899.     or.w    d1,d6            ;U/LY
  1900.     CHKLIM
  1901.     bsr    getreg            ;Rx
  1902.     bmi    iladrerr
  1903.     or.w    d1,d7            ;Rx
  1904.     bsr    getul
  1905.     or.w    d1,d6            ;U/LX
  1906.     cmpi.w    #','|OT_CHAR,(a0)
  1907.     bne    ~mac2            ;SFなし
  1908.     addq.l    #2,a0
  1909.     bsr    getsf
  1910.     bmi    iloprerr
  1911.     or.w    d1,d6            ;SF
  1912. ~mac2:
  1913.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  1914.     bne    ~mac3            ;省略時はワード
  1915.     or.w    #$0800,d6        ;ロング
  1916. ~mac3:
  1917.     OPOUT
  1918.     move.w    d6,d0
  1919.     bra    wrt1wobj
  1920.  
  1921. ;    MACL.wl Ry.ul,Rx.ul,<ea>,Rw
  1922. ;    MACL.wl Ry.ul,Rx.ul,<ea>&,Rw
  1923. ;    MACL.wl Ry.ul,Rx.ul,<<|>>,<ea>,Rw
  1924. ;    MACL.wl Ry.ul,Rx.ul,<<|>>,<ea>&,Rw
  1925. ;    MSACL.wl Ry.ul,Rx.ul,<ea>,Rw
  1926. ;    MSACL.wl Ry.ul,Rx.ul,<ea>&,Rw
  1927. ;    MSACL.wl Ry.ul,Rx.ul,<<|>>,<ea>,Rw
  1928. ;    MSACL.wl Ry.ul,Rx.ul,<<|>>,<ea>&,Rw
  1929. ~msacl::
  1930.     move.w    #$0100,d6
  1931.     bra    ~macl1
  1932. ~macl::
  1933.     clr.w    d6
  1934. ~macl1:
  1935.     bsr    getreg            ;Ry
  1936.     bmi    iladrerr
  1937.     ror.w    #4,d1
  1938.     or.w    d1,d6            ;Ry
  1939.     bsr    getul
  1940.     add.w    d1,d1            ;bit6→bit7
  1941.     or.w    d1,d6            ;U/LY
  1942.     CHKLIM
  1943.     bsr    getreg            ;Rx
  1944.     bmi    iladrerr
  1945.     or.w    d1,d6            ;Rx
  1946.     bsr    getul
  1947.     or.w    d1,d6            ;U/LX
  1948.     CHKLIM
  1949.     bsr    getsf
  1950.     bmi    ~macl2
  1951.     or.w    d1,d6            ;SF
  1952.     CHKLIM
  1953. ~macl2:
  1954.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  1955.     bne    ~macl3            ;省略時はワード
  1956.     or.w    #$0800,d6        ;ロング
  1957. ~macl3:
  1958.     movea.l    a4,a1
  1959.     bsr    geteamode_noopc        ;<ea>
  1960.     and.w    #EA_ADR|EA_INCADR|EA_DECADR|EA_DSPADR,d0
  1961.     beq    iladrerr
  1962.     bsr    getmam
  1963.     or.w    d1,d6            ;MAM
  1964.     CHKLIM
  1965.     bsr    getreg
  1966.     bmi    iladrerr
  1967.     ror.b    #3,d1            ;0000000032100004
  1968.     lsl.w    #4,d1            ;0000321000040000
  1969.     lsl.b    #2,d1            ;0000321004000000
  1970.     or.w    d1,d7            ;Rw
  1971.     or.w    (EACODE,a1),d7        ;<ea>
  1972.     DSPOPOUT            ;(d16,an)があるのでOPOUTは不可
  1973.     move.w    d6,d0
  1974.     bsr    wrt1wobj
  1975.     bra    eadataout
  1976.  
  1977. ;$0000='.l',$0040='.u',省略時は.lとみなす
  1978. getul:
  1979.     move.w    (a0)+,d0
  1980.     moveq.l    #$40,d1
  1981.     cmp.w    #'u'|OT_MAC,d0        ;.u
  1982.     beq    getul1
  1983.     clr.w    d1
  1984.     cmp.w    #OT_SIZE|SZ_LONG,d0    ;.l
  1985.     beq    getul1
  1986.     subq.l    #2,a0
  1987. getul1:
  1988.     rts
  1989.  
  1990. ;$0200='<<',$0600='>>'
  1991. getsf:
  1992.     move.w    (a0),d0
  1993.     move.w    #$0200,d1
  1994.     cmp.w    #'<'|OT_CHAR,d0
  1995.     beq    getsf1
  1996.     move.w    #$0600,d1
  1997.     cmp.w    #'>'|OT_CHAR,d0
  1998.     bne    getsf2
  1999. getsf1:
  2000.     cmp.w    (2,a0),d0
  2001.     bne    getsf2
  2002.     addq.l    #4,a0
  2003.     rts
  2004.  
  2005. getsf2:
  2006.     moveq.l    #-1,d1
  2007.     rts
  2008.  
  2009. ;$0000=&なし,$0020=&あり
  2010. getmam:
  2011.     clr.w    d1
  2012.     cmpi.w    #'&'|OT_CHAR,(a0)
  2013.     bne    getmam2
  2014. getmam1:
  2015.     addq.l    #2,a0
  2016.     moveq.l    #$20,d1
  2017. getmam2:
  2018.     rts
  2019.  
  2020. ;----------------------------------------------------------------
  2021. ;    movea    <ea>,An
  2022. ~movea::
  2023.     move.w    (a0),d0
  2024.     cmp.w    #REG_USP|OT_REGISTER,d0
  2025.     beq    ~move_frusp        ;move from USP
  2026.     movea.l    a4,a1
  2027.     bsr    geteamode        ;実効アドレスオペランドを得る
  2028.     CHKLIM
  2029.     bsr    getareg            ;アドレスレジスタオペランドを得る
  2030.     bmi    iladrerr
  2031. ~movea1:
  2032.     SETREGH
  2033.     tst.b    (OPTMOVEA,a6)
  2034.     beq    ~movea199        ;MOVEAの最適化に対応しない
  2035.     move.w    (EACODE,a1),d0
  2036.     cmp.w    #%001_000,d0
  2037.     blo    ~movea100
  2038.     cmp.w    #%001_111,d0
  2039.     bls    ~movea130        ;MOVEA.L Am,An
  2040. ~movea100:
  2041.     cmpi.w    #%111_100,d0
  2042.     bne    ~movea199        ;#immでないので最適化できない
  2043.     tst.b    (RPNSIZE1,a1)
  2044.     bpl    ~movea199        ;#immにサイズ指定があるので最適化しない
  2045.     tst.w    (RPNLEN1,a1)
  2046.     bpl    ~movea199        ;定数でないので最適化できない
  2047.     move.l    (RPNBUF1,a1),d0
  2048.     beq    ~leaabs0        ;MOVEA.? #0,An→SUBA.L An,An
  2049.     ext.l    d0
  2050.     cmp.l    (RPNBUF1,a1),d0
  2051.     bne    ~movea199        ;$FFFF8000≦imm≦$00007FFFでない
  2052.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  2053.     bne    ~movea199        ;.Lでないので最適化できない
  2054.                     ;(サイズ省略時も.Wなので不可)
  2055.     move.b    #SZ_WORD,(CMDOPSIZE,a6)    ;MOVEA.L #imm,An→MOVEA.W #imm,An
  2056.     ori.w    #$1000,d7        ;short addressingのワーニングは出さない
  2057.     bra    ~movea5
  2058.  
  2059. ~movea130:
  2060. ;MOVEA.? Am,An
  2061.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  2062.     bne    ~movea199        ;.Lでないので最適化できない
  2063.                     ;(サイズ省略時も.Wなので不可)
  2064.     ror.w    #7,d0
  2065.     eor.w    d7,d0
  2066.     and.w    #$0E00,d0
  2067.     bne    ~movea199        ;レジスタ番号が違う
  2068.     rts                ;MOVEA.L An,An
  2069.  
  2070. ~movea199:
  2071.     bsr    getopsize        ;サイズを得る
  2072.     cmp.b    #SZ_WORD,d0
  2073.     bne    ~movea5
  2074.     ori.w    #$1000,d7        ;.w
  2075.     bsr    shortwarn
  2076. ~movea5:
  2077.     or.w    (EACODE,a1),d7
  2078. ;2番目と3番目のチェック
  2079. f43g_second::
  2080.     tst.b    (F43GTEST,a6)
  2081.     beq    f43g_second1
  2082.     btst.l    #12,d7
  2083.     bne    ~movea6            ;.w
  2084. ;movea.l <ea>,an
  2085.     cmpi.w    #%010_000,(EACODE,a1)
  2086.     blo    ~movea6            ;movea.l rn,an
  2087. ;    cmpi.w    #%111_100,EACODE(a1)
  2088. ;    beq    ~movea6            ;movea.l #imm,an
  2089. ;#immは関係ないはずだが念のため
  2090. ;movea.l {mem},an
  2091.     move.l    a0,-(sp)        ;a0は破壊しないこと
  2092.     movea.l    (F43GPTR,a6),a0
  2093.     movea.l    (4,a0),a0        ;直前のレコード
  2094.     moveq.l    #%00011,d0
  2095.     and.b    (12,a0),d0
  2096.     beq    ~movea7            ;直前が1番目と2番目のいずれでもない
  2097.     movea.l    (a0),a0            ;今回のレコード
  2098.     add.b    d0,d0
  2099.     or.b    d0,(12,a0)        ;2番目または3番目に該当する
  2100.     move.w    d7,d0
  2101.     rol.w    #7,d0
  2102.     bset.b    d0,(13,a0)        ;デスティネーションのレジスタ番号
  2103. ~movea7:
  2104.     movea.l    (sp)+,a0
  2105. ~movea6:
  2106.     bsr    f43g_fifth        ;5番目のチェック
  2107. f43g_second1:
  2108.     DSPOPOUT
  2109.     bra    eadataout
  2110.  
  2111. ;----------------------------------------------------------------
  2112. ;    moveq    #xx,Dn
  2113. ~moveq::
  2114.     movea.l    a4,a1
  2115.     bsr    geteamode        ;実効アドレスオペランドを得る
  2116.     cmp.w    #EA_IMM,d0
  2117.     bne    iladrerr        ;#xxでなければエラー
  2118.     CHKLIM
  2119.     bsr    getdreg            ;データレジスタオペランドを得る
  2120.     bmi    iladrerr
  2121. ~moveq1:
  2122.     SETREGH
  2123.     tst.w    (RPNLEN1,a1)
  2124.     bpl    ~moveq_expr        ;式の値が未確定
  2125.     move.l    (RPNBUF1,a1),d0
  2126.     move.l    d0,d1
  2127.     ext.w    d0
  2128.     ext.l    d0
  2129.     cmp.l    d0,d1
  2130.     beq    ~moveq5
  2131.     cmp.l    #$00000100,d1
  2132.     bcc    ilquickerr_moveq    ;-$80~$FFの範囲外
  2133. ~moveq5:
  2134.     move.b    d0,d7
  2135.     OPOUTrts
  2136.  
  2137. ~moveq_expr:
  2138.     addq.l    #2,(LOCATION,a6)    ;式の場合
  2139.     move.w    #T_CODERPN|TCR_MOVEQ,d0
  2140.     bsr    wrtobjd0w
  2141.     move.w    d7,d0
  2142.     bsr    wrtd0w
  2143.     moveq.l    #0,d0            ;(サイズは無関係)
  2144.     bra    ead_outrpn
  2145.  
  2146. ;----------------------------------------------------------------
  2147. ;    clr    <ea>
  2148. ~clr::
  2149.     movea.l    a4,a1
  2150.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2151.     cmp.w    #EA_DN,d0
  2152.     bne    ~clr99            ;Dnでないので最適化できない
  2153.     cmpi.b    #SZ_LONG,(CMDOPSIZE,a6)
  2154.     bne    ~clr99            ;.Lでないので最適化できない
  2155.                     ;(サイズ省略時も.Wなので不可)
  2156.     tst.b    (OPTCLR,a6)
  2157.     beq    ~clr99            ;CLRの最適化に対応しない
  2158.     bran68    d1,~clr99        ;68020以上ならば最適化しない
  2159.     move.w    #$7000,d7
  2160.     move.w    (EACODE,a1),d1
  2161.     SETREGH
  2162.     OPOUTrts
  2163.  
  2164. ~clr99:
  2165.     cmp.w    #EA_AN,d0
  2166. ;ColdFireでもclrはdnのみではない
  2167.     bne    ~clr_negnot1
  2168.     move.w    #$90C0,d7        ;clr An → suba An,An
  2169.     tst.b    (CMDOPSIZE,a6)        ;cmpi.b #SZ_BYTE,(CMDOPSIZE,a6)
  2170.     beq    ilsizeerr_an        ;.bならエラー
  2171.     move.w    (EACODE,a1),d1
  2172.     andi.w    #$0007,d1
  2173.     bra    ~sbadcpa1
  2174.  
  2175. ;ColdFireでもclrはdnのみではない
  2176. ~clr_negnot1:
  2177.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  2178.     beq    iladrerr
  2179.     bra    ~negnot11
  2180.  
  2181. ;----------------------------------------------------------------
  2182. ;    neg/negx/not    <ea>
  2183. ~negnot::
  2184.     movea.l    a4,a1
  2185.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2186. ~negnot1:
  2187.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  2188.     beq    iladrerr
  2189. ;neg/negx/not
  2190.     tst.b    (CPUTYPE2,a6)
  2191.     beq    ~negnot11
  2192.     and.w    #EA_DN,d0
  2193.     beq    iladrerr
  2194. ~negnot11:
  2195.     bsr    setopsize        ;オペレーションサイズのセット
  2196.     or.w    (EACODE,a1),d7
  2197.     bsr    f43g_fifth        ;5番目のチェック
  2198.     DSPOPOUT
  2199.     bra    eadataout
  2200.  
  2201. ;----------------------------------------------------------------
  2202. ;    tst    <ea>
  2203. ~tst::
  2204.     movea.l    a4,a1
  2205. ;ColdFireでもtstはPC相対可
  2206.     bran68    d1,~tst0
  2207.     st.b    (ABSLTOOPCCAN,a6)    ;tstは68000ではPC相対が使えない
  2208. ~tst0:
  2209.     bsr    geteamode        ;実効アドレスオペランドを得る
  2210. ;ColdFireでもtstはすべてのモード
  2211.     bran68    d1,~tst1        ;68000/68010以外ならすべてのモード
  2212.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  2213.     beq    iladrerr
  2214. ~tst1:
  2215.     bsr    setopsize        ;オペレーションサイズのセット
  2216.     or.w    (EACODE,a1),d7
  2217.     bsr    f43g_fifth        ;5番目のチェック
  2218.     DSPOPOUT
  2219.     bra    eadataout
  2220.  
  2221. ;----------------------------------------------------------------
  2222. ;    jmp/jsr    <ea>
  2223. ~jmpjsr::
  2224.     tst.b    (OPTJMPJSR,a6)
  2225.     beq    ~peajsrjmp        ;JMP/JSRの最適化に対応しない
  2226.     move.b    (PCTOABSLNOTALL,a6),(PCTOABSLCAN,a6)
  2227.     movea.l    a4,a1
  2228.     bsr    geteamode        ;実効アドレスオペランドを得る
  2229.     cmp.w    #EA_ABSL,d0
  2230.     beq    ~jmpjsr_absl
  2231.     cmp.w    #EA_DSPPC,d0
  2232.     bne    ~pea99
  2233. ;jmp/jsr dpcのとき
  2234.     tst.b    (OPTSIZESET,a6)        ;(RPNSIZE1,a1)は不可
  2235.     bpl    ~pea99            ;サイズ指定がある(jmp (xxx.w,pc)など)
  2236.     tst.w    (RPNLEN1,a1)
  2237.     bpl    ~jmpjsr_to_jbrajbsr    ;ディスプレースメントが定数ではない
  2238. ;jmp/jsr (xxx,pc)
  2239.     moveq.l    #2,d1            ;d0は使用中
  2240.     cmp.l    (RPNBUF1,a1),d1
  2241.     bne    ~pea99            ;2以外の定数(jmp (-2,pc)など)
  2242. ;jmp/jsr (2,pc)
  2243.     cmp.w    #$4E80,d7        ;jsrか?
  2244.     beq    ~jmpjsr_pea
  2245. ;jmp (2,pc)
  2246.     rts                ;jmp (2,pc)は削除
  2247. ~jmpjsr_pea:
  2248. ;jsr (2,pc)
  2249.     move.l    #$487A_0002,d0        ;jsr (2,pc)はpea (2,pc)に最適化
  2250.     bra    wrt1lobj
  2251.  
  2252. ;jmp/jsr abslのとき
  2253. ~jmpjsr_absl:
  2254.     tst.b    (OPTSIZESET,a6)        ;RPNSIZE1(a1)は不可
  2255.     bpl    ~pea99            ;サイズ指定がある(jmp label.lなど)
  2256.     tst.w    (RPNLEN1,a1)
  2257.     bmi    ~pea99            ;定数(jmp $FF0038など)
  2258. ;jmp/jsr label
  2259. ~jmpjsr_to_jbrajbsr:
  2260.     sf.b    (OPTIONALPC,a1)        ;OPCの処理が行われないようにする
  2261.     cmp.w    #$4E80,d7        ;jsrか?
  2262.     beq    ~jmpjsr_jbsr
  2263. ;jmp label
  2264.     move.w    #$6000,d7        ;jmpをjbraにする
  2265.     bra    ~jbcc1
  2266.  
  2267. ~jmpjsr_jbsr:
  2268. ;jsr label
  2269.     move.w    #$6100,d7        ;jsrをjbsrにする
  2270.     bra    ~jbcc1
  2271.  
  2272. ;----------------------------------------------------------------
  2273. ;    pea/jsr/jmp    <ea>
  2274. ~peajsrjmp::
  2275.     move.b    (PCTOABSLNOTALL,a6),(PCTOABSLCAN,a6)
  2276.     movea.l    a4,a1
  2277.     bsr    geteamode        ;実効アドレスオペランドを得る
  2278. ~pea99:
  2279.     and.w    #EG_CTRL,d0        ;制御モード
  2280.     beq    iladrerr
  2281.     or.w    (EACODE,a1),d7
  2282.     DSPOPOUT
  2283.     bra    eadataout
  2284.  
  2285. ;----------------------------------------------------------------
  2286. ;    mov3q.l #imm,<ea>
  2287. ~mov3q::
  2288.     movea.l    a4,a1
  2289.     bsr    geteamode        ;実効アドレスオペランドを得る
  2290.     cmp.w    #EA_IMM,d0
  2291.     bne    iladrerr        ;#xxでなければエラー
  2292.     CHKLIM
  2293.     movea.l    a5,a1
  2294.     bsr    geteamode_noopc
  2295.     and.w    #EG_ALT,d0        ;可変モード
  2296.     beq    iladrerr
  2297.     or.w    (EACODE,a1),d7
  2298.     movea.l    a4,a1
  2299.     tst.w    (RPNLEN1,a1)
  2300.     bpl    ~mov3q_expr        ;式の値が未確定
  2301.     move.l    (RPNBUF1,a1),d1
  2302.     beq    ilquickerr_mov3q    ;-1,1~7の範囲外
  2303.     bpl    ~mov3q1
  2304.     addq.l    #1,d1
  2305. ~mov3q1:
  2306.     cmp.l    #7,d1
  2307.     bhi    ilquickerr_mov3q    ;-1,1~7の範囲外
  2308.     SETREGH
  2309.     DSPOPOUT
  2310.     movea.l    a5,a1
  2311.     bra    eadataout
  2312.  
  2313. ~mov3q_expr:
  2314.     move.w    #T_CODERPN|TCR_IMM3Q,d0
  2315.     bra    ~subaddq_expr1
  2316.  
  2317. ;----------------------------------------------------------------
  2318. ;    mvs/mvz <ea>,dn
  2319. ~mvsmvz::
  2320.     movea.l    a4,a1
  2321.     bsr    geteamode
  2322.     CHKLIM
  2323.     bsr    getdreg            ;データレジスタオペランドを得る
  2324.     bmi    iladrerr
  2325.     SETREGH
  2326.     bsr    setopsize        ;0=byteまたは1=wordのみ
  2327.     or.w    (EACODE,a1),d7
  2328.     DSPOPOUT
  2329.     bra    eadataout
  2330.  
  2331. ;----------------------------------------------------------------
  2332. ;    wddata <ea>
  2333. ~wddata::
  2334.     movea.l    a4,a1
  2335.     bsr    geteamode_noopc
  2336.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  2337.     beq    iladrerr
  2338.     bsr    setopsize        ;オペレーションサイズのセット
  2339.     or.w    (EACODE,a1),d7
  2340.     DSPOPOUT
  2341.     bra    eadataout
  2342.  
  2343. ;----------------------------------------------------------------
  2344. ;    wdebug <ea>
  2345. ~wdebug::
  2346.     movea.l    a4,a1
  2347.     bsr    geteamode_noopc
  2348.     and.w    #EA_ADR|EA_DSPADR,d0
  2349.     beq    iladrerr
  2350.     or.w    (EACODE,a1),d7
  2351.     DSPOPOUT            ;命令コードの出力
  2352.     move.w    #$0003,d0
  2353.     bsr    wrt1wobj        ;特殊オペランドの出力
  2354.     bra    eadataout
  2355.  
  2356. ;----------------------------------------------------------------
  2357. ~tas::
  2358.     tst.b    (CPUTYPE2,a6)
  2359.     beq    ~scc
  2360. ;ColdFire,5400のみ
  2361.     movea.l    a4,a1
  2362.     bsr    geteamode_noopc
  2363.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  2364.     beq    iladrerr
  2365.     bra    ~scc01
  2366.  
  2367. ;----------------------------------------------------------------
  2368. ;    s<cc>/nbcd/tas    <ea>
  2369. ~scc::
  2370.     movea.l    a4,a1
  2371.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2372.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  2373.     beq    iladrerr
  2374.     tst.b    (CPUTYPE2,a6)
  2375.     beq    ~scc01
  2376.     and.w    #EA_DN,d0
  2377.     beq    iladrerr
  2378. ~scc01:
  2379.     or.w    (EACODE,a1),d7
  2380.     bsr    f43g_fifth        ;5番目のチェック
  2381.     DSPOPOUT
  2382.     bra    eadataout
  2383.  
  2384. ;----------------------------------------------------------------
  2385. ;    dec/inc    <ea>
  2386. ~decinc::
  2387.     movea.l    a4,a1
  2388.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2389.     and.w    #EG_ALT,d0        ;可変モード
  2390.     beq    iladrerr
  2391.     cmp.w    #EA_AN,d0
  2392.     bne    ~decinc1
  2393.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  2394.     beq    ~decinc1
  2395.     bsr    shortwarn
  2396. ~decinc1:
  2397.     bsr    setopsize        ;オペレーションサイズのセット
  2398.     or.w    (EACODE,a1),d7
  2399.     bsr    f43g_fifth        ;5番目のチェック
  2400.     DSPOPOUT
  2401.     bra    eadataout
  2402.  
  2403. ;----------------------------------------------------------------
  2404. ;    chk    <ea>,Dn
  2405. ~chk::
  2406.     tst.b    (CMDOPSIZE,a6)
  2407.     bpl    ~chk99
  2408.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  2409. ~chk99:
  2410.     movea.l    a4,a1
  2411.     bsr    geteamode        ;実効アドレスオペランドを得る
  2412.     and.w    #EG_DATA,d0        ;データモード
  2413.     beq    iladrerr
  2414.     CHKLIM
  2415.     bsr    getdreg            ;データレジスタオペランドを得る
  2416.     bmi    iladrerr
  2417.     SETREGH
  2418.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  2419.     bne    ~chk1
  2420.     bra68    d0,ilsizeerr_000_long    ;68000/68010では.lは使えない
  2421.     bra    ~chk2
  2422.  
  2423. ~chk1:
  2424.     ori.w    #$0080,d7        ;.w
  2425. ~chk2:
  2426.     or.w    (EACODE,a1),d7
  2427.     bsr    f43g_fifth        ;5番目のチェック
  2428.     DSPOPOUT
  2429.     bra    eadataout
  2430.  
  2431. ;----------------------------------------------------------------
  2432. ;    lea    <ea>,An
  2433. ~lea::
  2434.     move.b    (PCTOABSLNOTALL,a6),(PCTOABSLCAN,a6)
  2435.     movea.l    a4,a1
  2436.     bsr    geteamode        ;実効アドレスオペランドを得る
  2437.     and.w    #EG_CTRL,d0        ;制御モード
  2438.     beq    iladrerr
  2439.     CHKLIM
  2440.     bsr    getareg            ;アドレスレジスタオペランドを得る
  2441.     bmi    iladrerr
  2442.     SETREGH
  2443.     or.w    (EACODE,a1),d7
  2444.     tst.b    (OPTLEA,a6)
  2445.     beq    ~lea199            ;LEAの最適化に対応しない
  2446.     cmpi.b    #EAD_ABSLW,(EADTYPE,a1)
  2447.     beq    ~leaabs            ;LEA 0,An→SUBA.L An,An
  2448.     move.w    d7,d0
  2449.     ror.w    #7,d0
  2450.     eor.w    d7,d0
  2451.     and.w    #$0E00,d0
  2452.     bne    ~lea199            ;レジスタ番号が異なるので最適化できない
  2453.     moveq.l    #%111_000,d0
  2454.     and.w    d7,d0
  2455.     cmp.w    #EAC_ADR,d0
  2456.     beq    ~leanop            ;LEA (An),An→削除
  2457.     cmp.w    #EAC_DSPADR,d0
  2458.     bne    ~lea199            ;(d,An)でないので最適化できない
  2459.     tst.w    (RPNLEN1,a1)
  2460.     bpl    ~lea199            ;定数でないので最適化できない
  2461.     tst.b    (OPTSIZESET,a6)
  2462.     bpl    ~lea199            ;サイズ指定があるので最適化しない
  2463.     move.l    (RPNBUF1,a1),d0
  2464.     beq    ~leanop            ;LEA (0,An),An→削除
  2465.     bpl    ~leaaddq
  2466. ~leasubq:
  2467.     moveq.l    #-8,d1
  2468.     cmp.l    d1,d0
  2469.     blt    ~lea199            ;-8より小さい
  2470. ;LEA→SUBQ
  2471.     neg.w    d0
  2472.     move.w    #$5148,d1
  2473.     bra    ~leaq
  2474.  
  2475. ~leaaddq:
  2476.     moveq.l    #8,d1
  2477.     cmp.l    d1,d0
  2478.     bgt    ~lea199            ;8より大きい
  2479. ;LEA→ADDQ
  2480.     move.w    #$5048,d1
  2481. ~leaq:
  2482.     rol.w    #7,d7
  2483.     and.w    #$0007,d7        ;レジスタ番号
  2484.     or.w    d7,d1
  2485.     and.w    #$0007,d0        ;8→0
  2486.     ror.w    #7,d0
  2487.     or.w    d1,d0
  2488.     bra    wrt1wobj
  2489.  
  2490. ;LEA.L (An),An/LEA.L (0,An),An
  2491. ~leanop:
  2492.     rts
  2493.  
  2494. ;LEA.L ABS,An
  2495. ~leaabs:
  2496.     tst.b    (OPTSIZESET,a6)
  2497.     bpl    ~lea199            ;サイズ指定がある
  2498.     tst.w    (RPNLEN1,a1)
  2499.     bpl    ~lea199            ;定数でない
  2500.     move.l    (RPNBUF1,a1),d0
  2501.     bne    ~lea199
  2502.     bsr    abswarn
  2503. ;LEA.L 0,An/MOVEA.? #0,An→SUBA.L An,An
  2504. ~leaabs0:
  2505.     move.w    d7,d1
  2506.     and.w    #$0E00,d1
  2507.     move.w    #$91C8,d7        ;SUBA.L An,An
  2508.     or.w    d1,d7
  2509.     rol.w    #7,d1
  2510.     or.w    d1,d7
  2511.     OPOUTrts
  2512.  
  2513. ~lea199:
  2514.     DSPOPOUT
  2515.     bra    eadataout
  2516.  
  2517. ;----------------------------------------------------------------
  2518. ;    chk2/cmp2    <ea>,Rn
  2519. ~cmpchk2::
  2520.     movea.l    a4,a1
  2521.     bsr    geteamode        ;実効アドレスオペランドを得る
  2522.     and.w    #EG_CTRL,d0        ;制御モード
  2523.     beq    iladrerr
  2524.     CHKLIM
  2525.     bsr    getreg            ;レジスタオペランドを得る
  2526.     bmi    iladrerr
  2527.     ror.w    #4,d1
  2528.     or.w    d7,d1
  2529.     move.w    #$00C0,d7
  2530.     bsr    getopsize        ;サイズを得る
  2531.     ror.w    #7,d0            ;サイズフィールドはb10-b9
  2532.     or.w    d0,d7
  2533.     or.w    (EACODE,a1),d7
  2534.     move.w    #C060,d0
  2535.     or.w    d0,(SOFTFLAG,a6)
  2536.     and.w    (CPUTYPE,a6),d0
  2537.     beq    ~cmpchk21
  2538.     bsr    softwarn
  2539. ~cmpchk21:
  2540. ;ソフトウェアエミュレーションなのでエラッタのチェックは不要
  2541.     DSPOPOUT            ;命令コードの出力
  2542.     move.w    d1,d0
  2543.     bsr    wrt1wobj        ;特殊オペランドの出力
  2544.     bra    eadataout
  2545.  
  2546. ;----------------------------------------------------------------
  2547. ;    asl    Dn,Dn/#xx,Dn/<ea>
  2548. ~asl::
  2549.     clr.b    (EADTYPE,a5)        ;(subq/addqのイミディエイトオペランド対策)
  2550.     movea.l    a4,a1
  2551.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2552.     move.w    d0,d6
  2553.     tst.w    (a0)
  2554.     beq    ~sftrot_ea        ;<sftrot> <ea>
  2555.     CHKLIM
  2556.     bsr    getdreg            ;データレジスタオペランドを得る
  2557.     bmi    iladrerr
  2558.     SETREGL
  2559.     bsr    setopsize        ;オペレーションサイズのセット
  2560.     cmp.w    #EA_IMM,d6
  2561.     bne    ~sftrot_not_imm
  2562. ~asl_imm:
  2563.     tst.b    (OPTASL,a6)
  2564.     beq    ~sftrot_imm        ;ASLの最適化に対応しない
  2565.     move.w    #C060,d0
  2566.     and.w    (CPUTYPE,a6),d0
  2567.     bne    ~sftrot_imm        ;68060ならば最適化しない
  2568.     tst.b    (RPNSIZE1,a1)
  2569.     bpl    ~sftrot_imm        ;#immにサイズ指定があるので最適化しない
  2570.     tst.w    (RPNLEN1,a1)
  2571.     bpl    ~sftrot_imm        ;定数でないので最適化できない
  2572.     moveq.l    #1,d0
  2573.     cmp.l    (RPNBUF1,a1),d0
  2574.     bne    ~sftrot_imm        ;1以外は最適化できない
  2575.     moveq.l    #$0007,d0
  2576.     and.w    d7,d0
  2577.     move.w    d0,d1
  2578.     lsl.w    #3,d0
  2579.     or.b    (CMDOPSIZE,a6),d0    ;0,1,2のいずれか(-1は1に変更済み)
  2580.     lsl.w    #6,d0
  2581.     or.w    d1,d0
  2582.     or.w    #$D000,d0        ;ADD Dn,Dn
  2583.     bra    wrt1wobj
  2584.  
  2585. ;----------------------------------------------------------------
  2586. ;    as?/ls?/rox?/ro?    Dn,Dn/#xx,Dn/<ea>
  2587. ~sftrot::
  2588.     clr.b    (EADTYPE,a5)        ;(subq/addqのイミディエイトオペランド対策)
  2589.     movea.l    a4,a1
  2590.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2591.     move.w    d0,d6
  2592.     tst.w    (a0)
  2593.     beq    ~sftrot_ea        ;<sftrot> <ea>
  2594.     CHKLIM
  2595.     bsr    getdreg            ;データレジスタオペランドを得る
  2596.     bmi    iladrerr
  2597.     SETREGL
  2598.     bsr    setopsize        ;オペレーションサイズのセット
  2599.     cmp.w    #EA_IMM,d6
  2600.     beq    ~sftrot_imm        ;<sftrot> #xx,Dn (subq/addqと同じ)
  2601. ~sftrot_not_imm:
  2602.     cmp.w    #EA_DN,d6
  2603.     bne    iladrerr
  2604.     move.w    (EACODE,a1),d1        ;<sftrot> Dn,Dn
  2605.     SETREGH
  2606.     or.w    #$0020,d7
  2607.     OPOUTrts
  2608.  
  2609. ~sftrot_ea:                ;<sftrot> <ea>
  2610.     cmp.w    #EA_DN,d0
  2611.     bne    ~sftrot_ea1
  2612.     or.w    #$0200,d7        ;<sftrot> Dn → <sftrot> #1,Dn
  2613.     move.w    (EACODE,a1),d1
  2614.     SETREGL
  2615.     bsr    setopsize        ;オペレーションサイズのセット
  2616.     OPOUTrts
  2617.  
  2618. ~sftrot_ea1:
  2619. ;dnは既に除外してある
  2620.     tst.b    (CPUTYPE2,a6)
  2621.     bne    iladrerr
  2622.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  2623.     beq    iladrerr
  2624.     bsr    getopsize
  2625.     cmp.b    #SZ_WORD,d0
  2626.     bne    ilsizeerr_sftrotmem
  2627.     move.w    d7,d0
  2628.     and.w    #$0018,d0        ;シフト・ローテイトタイプ
  2629.     rol.w    #6,d0
  2630.     or.w    #$00C0,d0
  2631.     or.w    d0,d7
  2632.     and.w    #$FFC0,d7
  2633.     or.w    (EACODE,a1),d7
  2634.     bsr    f43g_fifth        ;5番目のチェック
  2635.     DSPOPOUT
  2636.     bra    eadataout
  2637.  
  2638. ;----------------------------------------------------------------
  2639. ;    bchg/bclr/bset    Dn,<ea>/#xx,<ea>
  2640. ~bchclst::
  2641.     move.w    #EG_DATA&EG_ALT,d6    ;データ・可変モード
  2642.     st.b    (ABSLTOOPCCAN,a6)
  2643.     bra    ~btst1
  2644.  
  2645. ;----------------------------------------------------------------
  2646. ;    btst    Dn,<ea>/#xx,<ea>
  2647. ~btst::
  2648.     move.w    #EG_DATA,d6        ;データモード
  2649. ~btst1:
  2650.     bsr    getdreg            ;データレジスタオペランドを得る
  2651.     bmi    ~btst5
  2652.     SETREGH
  2653.     or.w    #$0100,d7        ;Dn,<ea>
  2654.     CHKLIM
  2655.     movea.l    a5,a1
  2656. ;btstは68000でもPC相対が使える
  2657.     bsr    geteamode        ;実効アドレスオペランドを得る
  2658.     move.b    #SZ_LONG,d1        ;<ea>がDnの場合サイズは.l
  2659.     cmp.w    #EA_DN,d0
  2660.     beq    ~btst2
  2661.     clr.b    d1            ;move.b #SZ_BYTE,d1
  2662.                     ;<ea>がDn以外の場合サイズは.b
  2663.     and.w    d6,d0            ;データ(btst)/データ・可変(bchg/bclr/bset)モード
  2664.     beq    iladrerr
  2665. ~btst2:
  2666.     move.b    (CMDOPSIZE,a6),d6
  2667.     bmi    ~btst3
  2668.     cmp.b    d1,d6
  2669.     beq    ~btst3
  2670.     tst.b    d1            ;cmp.b #SZ_BYTE,d1
  2671.     beq    ilsizeerr_bitmem
  2672.     bra    ilsizeerr_bitreg
  2673. ~btst3:
  2674.     move.b    d1,(CMDOPSIZE,a6)
  2675.     or.w    (EACODE,a1),d7
  2676.     bsr    f43g_fifth        ;5番目のチェック
  2677.     DSPOPOUT
  2678.     bra    eadataout
  2679.  
  2680. ~btst5:
  2681.     movea.l    a4,a1
  2682.     bsr    geteamode        ;実効アドレスオペランドを得る
  2683.     cmp.w    #EA_IMM,d0
  2684.     bne    iladrerr        ;#xxでなければエラー
  2685. ;ColdFireはbchg/bclr/bset/btst #imm,<ea>は(d8,an,ix)不可
  2686.     tst.b    (CPUTYPE2,a6)
  2687.     beq    ~btst50
  2688.     and.w    #.not.EA_IDXADR,d6
  2689. ~btst50:
  2690.     or.w    #$0800,d7        ;#xx,<ea>
  2691.     CHKLIM
  2692.     movea.l    a5,a1
  2693. ;btstは68000でもPC相対が使える
  2694.     bsr    geteamode        ;実効アドレスオペランドを得る
  2695.     move.b    #SZ_LONG,d1        ;<ea>がDnの場合サイズは.l
  2696.     cmp.w    #EA_DN,d0
  2697.     beq    ~btst6
  2698.     clr.b    d1            ;move.b #SZ_BYTE,d1
  2699.                     ;<ea>がDn以外の場合サイズは.b
  2700.     and.w    #.not.EA_IMM,d6        ;#xx,#xxはエラー
  2701.     and.w    d6,d0            ;データ(btst)/データ・可変(bchg/bclr/bset)モード
  2702.     beq    iladrerr
  2703. ~btst6:
  2704.     move.b    (CMDOPSIZE,a6),d6
  2705.     bmi    ~btst7
  2706.     cmp.b    d1,d6
  2707.     beq    ~btst7
  2708.     tst.b    d1            ;cmp.b #SZ_BYTE,d1
  2709.     beq    ilsizeerr_bitmem
  2710.     bra    ilsizeerr_bitreg
  2711. ~btst7:
  2712.     or.w    (EACODE,a1),d7
  2713.     bsr    f43g_fifth        ;5番目のチェック
  2714.     DSPOPOUT
  2715.     clr.b    (CMDOPSIZE,a6)        ;move.b #SZ_BYTE,(CMDOPSIZE,a6)
  2716.     movea.l    a4,a1
  2717.     bsr    eadataout        ;ビット番号を出力
  2718.     movea.l    a5,a1
  2719.     bra    eadataout
  2720.  
  2721. ;----------------------------------------------------------------
  2722. ;    bfchg/bfclr/bfset    <ea>{of:wd}    (68020/68030/68040)
  2723. ~bfchclst::
  2724.     movea.l    a4,a1
  2725.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2726.     and.w    #(EG_CTRL&EG_ALT)|EA_DN,d0    ;制御・可変モードまたはDn
  2727.     beq    iladrerr
  2728.     movea.l    a5,a1
  2729.     bsr    getbitfield        ;ビットフィールド指定を得る
  2730.     move.w    d0,d6
  2731.     movea.l    a4,a1
  2732.     or.w    (EACODE,a1),d7
  2733.     bsr    f43g_fifth        ;5番目のチェック
  2734.     DSPOPOUT
  2735.     bsr    bfdataout
  2736.     movea.l    a4,a1
  2737.     bra    eadataout
  2738.  
  2739. ;----------------------------------------------------------------
  2740. ;    ビットフィールドデータを出力する
  2741. bfdataout:
  2742.     movea.l    a5,a1
  2743.     tst.w    (RPNLEN1,a1)        ;オフセット
  2744.     bne    bfdataout5
  2745.     tst.w    (RPNLEN2,a1)        ;幅
  2746.     bne    bfdataout1
  2747.     move.w    d6,d0            ;両方とも定数/レジスタの場合
  2748.     bra    wrt1wobj        ;特殊オペランドの出力
  2749.  
  2750. bfdataout1:
  2751.     addq.l    #2,(LOCATION,a6)
  2752.     move.w    #T_BITFIELD|TBF_WD,d0    ;幅が式の場合
  2753.     bsr    wrtobjd0w
  2754.     move.w    d6,d0
  2755.     bsr    wrtd0w
  2756.     moveq.l    #0,d0            ;(サイズは無関係)
  2757.     move.w    (RPNLEN2,a1),d1
  2758.     lea.l    (RPNBUF2,a1),a1
  2759.     bra    wrtrpn            ;式を出力する
  2760.  
  2761. bfdataout5:
  2762.     addq.l    #2,(LOCATION,a6)
  2763.     tst.w    (RPNLEN2,a1)        ;幅
  2764.     bne    bfdataout6
  2765.     move.w    #T_BITFIELD|TBF_OF,d0    ;オフセットが式の場合
  2766.     bsr    wrtobjd0w
  2767.     move.w    d6,d0
  2768.     bsr    wrtd0w
  2769.     moveq.l    #0,d0            ;(サイズは無関係)
  2770.     move.w    (RPNLEN1,a1),d1
  2771.     lea.l    (RPNBUF1,a1),a1
  2772.     bra    wrtrpn            ;式を出力する
  2773.  
  2774. bfdataout6:
  2775.     move.w    #T_BITFIELD|TBF_OFWD,d0    ;オフセット・幅とも式の場合
  2776.     bsr    wrtobjd0w
  2777.     move.w    d6,d0
  2778.     bsr    wrtd0w
  2779.     moveq.l    #0,d0            ;(サイズは無関係)
  2780.     move.w    (RPNLEN1,a1),d1
  2781.     lea.l    (RPNBUF1,a1),a1
  2782.     bsr    wrtrpn            ;式を出力する
  2783.     movea.l    a5,a1
  2784.     moveq.l    #0,d0            ;(サイズは無関係)
  2785.     move.w    (RPNLEN2,a1),d1
  2786.     lea.l    (RPNBUF2,a1),a1
  2787.     bra    wrtrpn            ;式を出力する
  2788.  
  2789. ;----------------------------------------------------------------
  2790. ;    bftst    <ea>{of:wd}        (68020/68030/68040)
  2791. ~bftst::
  2792.     movea.l    a4,a1
  2793.     bsr    geteamode        ;実効アドレスオペランドを得る
  2794.     and.w    #EG_CTRL|EA_DN,d0    ;制御モードまたはDn
  2795.     beq    iladrerr
  2796.     movea.l    a5,a1
  2797.     bsr    getbitfield        ;ビットフィールド指定を得る
  2798.     move.w    d0,d6
  2799.     movea.l    a4,a1
  2800.     or.w    (EACODE,a1),d7
  2801.     bsr    f43g_fifth        ;5番目のチェック
  2802.     DSPOPOUT
  2803.     bsr    bfdataout
  2804.     movea.l    a4,a1
  2805.     bra    eadataout
  2806.  
  2807. ;----------------------------------------------------------------
  2808. ;    bfexts/bfextu/bfffo    <ea>{of:wd},Dn    (68020/68030/68040)
  2809. ~bfextffo::
  2810.     movea.l    a4,a1
  2811.     bsr    geteamode        ;実効アドレスオペランドを得る
  2812.     and.w    #EG_CTRL|EA_DN,d0    ;制御モードまたはDn
  2813.     beq    iladrerr
  2814.     movea.l    a5,a1
  2815.     bsr    getbitfield        ;ビットフィールド指定を得る
  2816.     move.w    d0,d6
  2817.     CHKLIM
  2818.     bsr    getdreg            ;データレジスタオペランドを得る
  2819.     bmi    iladrerr
  2820.     ror.w    #4,d1
  2821.     or.w    d1,d6
  2822.     movea.l    a4,a1
  2823.     or.w    (EACODE,a1),d7
  2824.     bsr    f43g_fifth        ;5番目のチェック
  2825.     DSPOPOUT
  2826.     bsr    bfdataout
  2827.     movea.l    a4,a1
  2828.     bra    eadataout
  2829.  
  2830. ;----------------------------------------------------------------
  2831. ;    bfins    Dn,<ea>{of:wd}        (68020/68030/68040)
  2832. ~bfins::
  2833.     bsr    getdreg            ;データレジスタオペランドを得る
  2834.     bmi    iladrerr
  2835.     ror.w    #4,d1
  2836.     move.w    d1,d6
  2837.     CHKLIM
  2838.     movea.l    a4,a1
  2839.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  2840.     and.w    #(EG_CTRL&EG_ALT)|EA_DN,d0    ;制御・可変モードまたはDn
  2841.     beq    iladrerr
  2842.     movea.l    a5,a1
  2843.     bsr    getbitfield        ;ビットフィールド指定を得る
  2844.     or.w    d0,d6
  2845.     movea.l    a4,a1
  2846.     or.w    (EACODE,a1),d7
  2847.     bsr    f43g_fifth        ;5番目のチェック
  2848.     DSPOPOUT
  2849.     bsr    bfdataout
  2850.     movea.l    a4,a1
  2851.     bra    eadataout
  2852.  
  2853. ;----------------------------------------------------------------
  2854. ;    pack/unpk    -(An),-(An),#xx/Dn,Dn,#xx    (68020/68030/68040)
  2855. ~packunpk::
  2856.     bsr    getdreg            ;データレジスタオペランドを得る
  2857.     bmi    ~packunpk5
  2858.     SETREGL
  2859.     CHKLIM
  2860.     bsr    getdreg            ;データレジスタオペランドを得る
  2861.     bmi    iladrerr
  2862. ~packunpk1:
  2863.     SETREGH
  2864.     CHKLIM
  2865.     movea.l    a4,a1
  2866.     bsr    geteamode        ;実効アドレスオペランドを得る
  2867.     cmp.w    #EA_IMM,d0
  2868.     bne    iladrerr        ;#xxでなければエラー
  2869.     OPOUT
  2870.     move.b    #SZ_WORD,(CMDOPSIZE,a6)    ;データはワード固定
  2871.     bra    eadataout
  2872.  
  2873. ~packunpk5:                ;-(An),-(An),#xx
  2874.     ori.w    #$0008,d7
  2875.     movea.l    a4,a1
  2876.     bsr    geteamode        ;実効アドレスオペランドを得る
  2877.     cmp.w    #EA_DECADR,d0
  2878.     bne    iladrerr        ;-(An)でなければエラー
  2879.     bsr    f43g_fifthadr        ;5番目のチェック
  2880.     move.w    (EACODE,a1),d1
  2881.     SETREGL
  2882.     CHKLIM
  2883.     movea.l    a4,a1
  2884.     bsr    geteamode        ;実効アドレスオペランドを得る
  2885.     cmp.w    #EA_DECADR,d0
  2886.     bne    iladrerr        ;-(An)でなければエラー
  2887.     bsr    f43g_fifthadr        ;5番目のチェック
  2888.     move.w    (EACODE,a1),d1
  2889.     bra    ~packunpk1
  2890.  
  2891. ;----------------------------------------------------------------
  2892. ;    subx/addx    Dn,Dn/-(An),-(An)
  2893. ~subaddx::
  2894.     bsr    setopsize        ;オペレーションサイズのセット
  2895. ;    bra    ~sabcd            ;後の処理はsbcd/abcdと同じ
  2896.  
  2897. ;----------------------------------------------------------------
  2898. ;    sbcd/abcd    Dn,Dn/-(An),-(An)
  2899. ~sabcd::
  2900.     bsr    getdreg            ;データレジスタオペランドを得る
  2901.     bmi    ~sabcd5
  2902.     SETREGL
  2903.     CHKLIM
  2904.     bsr    getdreg            ;データレジスタオペランドを得る
  2905.     bmi    iladrerr
  2906.     SETREGH
  2907.     OPOUTrts
  2908.  
  2909. ~sabcd5:
  2910. ;subx/addx -(an),-(an)
  2911.     tst.b    (CPUTYPE2,a6)
  2912.     bne    iladrerr
  2913.     or.w    #$0008,d7
  2914.     movea.l    a4,a1
  2915.     bsr    geteamode        ;実効アドレスオペランドを得る
  2916.     cmp.w    #EA_DECADR,d0
  2917.     bne    iladrerr        ;-(An)でなければエラー
  2918.     bsr    f43g_fifthadr        ;5番目のチェック
  2919.     move.w    (EACODE,a1),d1
  2920.     SETREGL
  2921.     CHKLIM
  2922.     movea.l    a4,a1
  2923.     bsr    geteamode        ;実効アドレスオペランドを得る
  2924.     cmp.w    #EA_DECADR,d0
  2925.     bne    iladrerr        ;-(An)でなければエラー
  2926.     bsr    f43g_fifthadr        ;5番目のチェック
  2927.     move.w    (EACODE,a1),d1
  2928.     SETREGH
  2929.     OPOUTrts
  2930.  
  2931. ;----------------------------------------------------------------
  2932. ;    divs/divu/muls/mulu    <ea>,Dn/<ea>,Dh(Dr):Dl(Dq)
  2933. ~divmul::
  2934.     movea.l    a4,a1
  2935.     bsr    geteamode        ;実効アドレスオペランドを得る
  2936.     and.w    #EG_DATA,d0        ;データモード
  2937.     beq    iladrerr
  2938.     move.w    d0,d6
  2939.     CHKLIM
  2940.     bsr    getopsize        ;サイズを得る
  2941.     cmp.b    #SZ_LONG,d0
  2942.     beq    ~divmul1        ;.l
  2943.     bsr    getdreg            ;データレジスタオペランドを得る
  2944.     bmi    iladrerr
  2945.     SETREGH
  2946.     or.w    (EACODE,a1),d7
  2947.     bsr    f43g_fifth        ;5番目のチェック
  2948.     DSPOPOUT
  2949.     bra    eadataout
  2950.  
  2951. ~divmul1:
  2952.     bra68    d0,ilsizeerr_000_long    ;68000/68010では.lは使えない
  2953. ;divu/divs/mulu/muls.l <ea>,Dn
  2954. ;ColdFireでは64ビットは使えないが.lは使える
  2955. ;ColdFireはdn,(an),(an)+,-(an),(d16,an)のみ
  2956.     tst.b    (CPUTYPE2,a6)
  2957.     beq    ~divmul11
  2958.     and.w    #EA_DN|EA_ADR|EA_INCADR|EA_DECADR|EA_DSPADR,d6    ;レジスタ番号注意
  2959.     beq    iladrerr
  2960. ~divmul11:
  2961.     move.w    d7,d6
  2962.     andi.w    #$4000,d7
  2963.     eori.w    #$4000,d7
  2964.     lsr.w    #8,d7
  2965.     ori.w    #$4C00,d7        ;命令コード
  2966.     andi.w    #$0100,d6
  2967.     lsl.w    #3,d6            ;特殊オペランド
  2968.     bsr    getdregp        ;データレジスタペアオペランドを得る
  2969.     beq    ~divmul2
  2970.     bsr    getdreg            ;データレジスタオペランドを得る
  2971.     bmi    iladrerr
  2972.     move.w    d1,d2            ;<ea>,Dl(Dq)
  2973.     bra    ~divmul3
  2974.  
  2975. ~divmul2:                ;<ea>,Dh(Dr):Dl(Dq)
  2976. ;ColdFireでは64ビットは使えない
  2977.     tst.b    (CPUTYPE2,a6)
  2978.     bne    iladrerr
  2979.     move.w    #C060,d0
  2980.     or.w    d0,(SOFTFLAG,a6)
  2981.     and.w    (CPUTYPE,a6),d0
  2982.     beq    ~divmul4
  2983.     bsr    softwarn
  2984. ~divmul4:
  2985.     or.w    #$0400,d6        ;64bit
  2986. ~divmul3:
  2987.     or.w    d1,d6            ;Dh(Dr)をセット
  2988.     ror.w    #4,d2
  2989.     or.w    d2,d6            ;Dl(Dq)をセット
  2990.     or.w    (EACODE,a1),d7
  2991.     bsr    f43g_fifth        ;5番目のチェック
  2992.     DSPOPOUT            ;命令コードの出力
  2993.     move.w    d6,d0
  2994.     bsr    wrt1wobj        ;特殊オペランドの出力
  2995.     bra    eadataout
  2996.  
  2997. ;----------------------------------------------------------------
  2998. ;    divsl/divul    <ea>,Dr:Dq    (68020/68030/68040)
  2999. ~divl::
  3000.     move.b    #SZ_LONG,(CMDOPSIZE,a6)
  3001.     movea.l    a4,a1
  3002.     bsr    geteamode        ;実効アドレスオペランドを得る
  3003.     and.w    #EG_DATA,d0        ;データモード
  3004.     beq    iladrerr
  3005.     CHKLIM
  3006.     move.w    d7,d6
  3007.     move.w    #$4C40,d7        ;命令コード
  3008.     bsr    getdregp        ;データレジスタペアオペランドを得る
  3009.     beq    ~divmul3
  3010.     bra    iladrerr
  3011.  
  3012. ;----------------------------------------------------------------
  3013. ;    cas    Dc,Du,<ea>        (68020/68030/68040)
  3014. ~cas::
  3015.     bsr    getdreg            ;データレジスタオペランドを得る
  3016.     bmi    iladrerr
  3017.     move.w    d1,d6            ;Dc
  3018.     CHKLIM
  3019.     bsr    getdreg            ;データレジスタオペランドを得る
  3020.     bmi    iladrerr
  3021.     lsl.w    #6,d1
  3022.     or.w    d1,d6            ;Du
  3023.     CHKLIM
  3024.     movea.l    a4,a1
  3025.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3026.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  3027.     beq    iladrerr
  3028.     bsr    getopsize        ;サイズを得る
  3029.     addq.w    #1,d0
  3030.     ror.w    #7,d0
  3031.     or.w    d0,d7            ;オペレーションサイズのセット
  3032.     or.w    (EACODE,a1),d7
  3033.     bsr    f43g_fifth        ;5番目のチェック
  3034.     DSPOPOUT            ;命令コードの出力
  3035.     move.w    d6,d0
  3036.     bsr    wrt1wobj        ;特殊オペランドの出力
  3037.     bra    eadataout
  3038.  
  3039. ;----------------------------------------------------------------
  3040. ;    cas2    Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)    (68020/68030/68040)
  3041. ~cas2::
  3042.     bsr    getdregp        ;データレジスタペアオペランドを得る
  3043.     bmi    iladrerr
  3044.     move.w    d1,d6            ;Dc1
  3045.     move.w    d2,d5            ;Dc2
  3046.     CHKLIM
  3047.     bsr    getdregp        ;データレジスタペアオペランドを得る
  3048.     bmi    iladrerr
  3049.     lsl.w    #6,d1
  3050.     lsl.w    #6,d2
  3051.     or.w    d1,d6            ;Du1
  3052.     or.w    d2,d5            ;Du2
  3053.     CHKLIM
  3054.     bsr    getregpp        ;レジスタ間接ペアオペランドを得る
  3055.     bmi    iladrerr
  3056.     ror.w    #4,d1
  3057.     ror.w    #4,d2
  3058.     or.w    d1,d6            ;Rn1
  3059.     or.w    d2,d5            ;Rn2
  3060.     bsr    getopsize        ;サイズを得る
  3061.     addq.w    #1,d0
  3062.     ror.w    #7,d0
  3063.     or.w    d0,d7            ;オペレーションサイズのセット
  3064.     move.w    #C060,d0
  3065.     or.w    d0,(SOFTFLAG,a6)
  3066.     and.w    (CPUTYPE,a6),d0
  3067.     beq    ~cas21
  3068.     bsr    softwarn
  3069. ~cas21:
  3070. ;ソフトウェアエミュレーションなのでエラッタのチェックは不要
  3071.     OPOUT                ;命令コードの出力
  3072.     move.w    d6,d0
  3073.     bsr    wrt1wobj        ;特殊オペランドの出力
  3074.     move.w    d5,d0
  3075.     bsr    wrt1wobj        ;特殊オペランドの出力
  3076.     bra    eadataout
  3077.  
  3078. ;----------------------------------------------------------------
  3079. ;    link    An,#xx
  3080. ~link::
  3081. ;ColdFireでもlinkは.wのみ(除外済み)
  3082.     bran68    d0,~link1
  3083.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)    ;68000/68010のlinkはワードのみ
  3084.     beq    ilsizeerr_000_long    ;.lなのでエラー
  3085.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  3086. ~link1:
  3087.     bsr    getareg            ;アドレスレジスタオペランドを得る
  3088.     bmi    iladrerr
  3089.     SETREGL
  3090.     CHKLIM
  3091.     movea.l    a4,a1
  3092.     bsr    geteamode        ;実効アドレスオペランドを得る
  3093.     cmp.w    #EA_IMM,d0
  3094.     bne    iladrerr        ;#xxでなければエラー
  3095.     move.b    (CMDOPSIZE,a6),d0
  3096.     cmp.b    #SZ_WORD,d0
  3097.     beq    ~linkw
  3098.     cmp.b    #SZ_LONG,d0
  3099.     beq    ~linkl
  3100.     tst.w    (RPNLEN1,a1)
  3101.     bpl    ~link_expr
  3102.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  3103.     move.l    (RPNBUF1,a1),d1
  3104.     move.l    d1,d0
  3105.     ext.l    d0
  3106.     cmp.l    d1,d0
  3107.     beq    ~linkw
  3108.     move.b    #SZ_LONG,(CMDOPSIZE,a6)
  3109. ~linkl:                    ;link.l
  3110.     and.w    #$0007,d7
  3111.     or.w    #$4808,d7
  3112. ~linkw:                    ;link.w
  3113.     OPOUT
  3114.     bra    eadataout
  3115.  
  3116. ~link_expr:                ;式の場合
  3117.     move.w    #T_LINK,d0
  3118.     move.b    d7,d0
  3119.     and.b    #7,d0            ;アドレスレジスタ番号
  3120.     bsr    wrtobjd0w
  3121.     move.l    (EXTLEN,a6),d0
  3122.     addq.l    #2,d0
  3123.     add.l    d0,(LOCATION,a6)
  3124.     move.b    (EXTSIZE,a6),d0
  3125.     or.b    #ESZ_OPT,d0        ;(最適化対象)
  3126.     bra    ead_outrpn
  3127.  
  3128. ;----------------------------------------------------------------
  3129. ;    movem    <list>,<ea>/<ea>,<list>
  3130. ~movem::
  3131.     bsr    getreglist        ;レジスタリストオペランドを得る
  3132.     bmi    ~movem5
  3133.     move.w    d1,-(sp)
  3134.     CHKLIM                ;<list>,<ea>
  3135.     movea.l    a4,a1
  3136.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3137. ;movem <list>,<ea>
  3138. ;ColdFireは(an),(d16,an)のみ
  3139.     tst.b    (CPUTYPE2,a6)
  3140.     beq    ~movem00
  3141.     and.w    #EA_ADR|EA_DSPADR,d0
  3142.     beq    iladrerr
  3143. ~movem00:
  3144.     move.w    (sp)+,d1
  3145.     move.w    d0,d2
  3146.     and.w    #EG_CTRL&EG_ALT,d2    ;制御・可変モード
  3147.     bne    ~movem6
  3148.     cmp.w    #EA_DECADR,d0        ;-(An)
  3149.     bne    iladrerr
  3150.     moveq.l    #0,d0            ;-(An)の場合はレジスタリストを反転する
  3151.     moveq.l    #16-1,d2
  3152. ~movem1:
  3153.     roxl.w    #1,d1
  3154.     roxr.w    #1,d0
  3155.     dbra    d2,~movem1
  3156.     move.w    d0,d1
  3157.     bra    ~movem6
  3158.  
  3159. ~movem5:                ;<ea>,<list>
  3160.     ori.w    #$0400,d7
  3161.     movea.l    a4,a1
  3162.     bsr    geteamode        ;実効アドレスオペランドを得る
  3163.     and.w    #EG_CTRL|EA_INCADR,d0    ;制御モードまたは(An)+
  3164.     beq    iladrerr
  3165. ;movem <ea>,<list>
  3166. ;ColdFireは(an),(d16,an)のみ
  3167.     tst.b    (CPUTYPE2,a6)
  3168.     beq    ~movem51
  3169.     and.w    #EA_ADR|EA_DSPADR,d0
  3170.     beq    iladrerr
  3171. ~movem51:
  3172.     CHKLIM
  3173.     bsr    getreglist        ;レジスタリストオペランドを得る
  3174.     bmi    iladrerr
  3175. ~movem6:
  3176.     bsr    getopsize        ;サイズを得る
  3177.     cmpi.b    #SZ_WORD,d0
  3178.     beq    ~movem7
  3179.     ori.w    #$0040,d7        ;.l
  3180. ~movem7:
  3181.     or.w    (EACODE,a1),d7
  3182.     bsr    f43g_fifth        ;5番目のチェック
  3183.     DSPOPOUT            ;命令コードの出力
  3184.     move.w    d1,d0            ;レジスタリスト
  3185.     bsr    wrt1wobj        ;特殊オペランドの出力
  3186.     bra    eadataout
  3187.  
  3188. ;----------------------------------------------------------------
  3189. ;    movep    Dn,(d,An)/(d,An),Dn
  3190. ~movep::
  3191.     bsr    getdreg            ;データレジスタオペランドを得る
  3192.     bmi    ~movep5
  3193.     or.w    #$0080,d7        ;Dn,(d,An)
  3194.     SETREGH
  3195.     CHKLIM
  3196.     bsr    getdspadr
  3197.     bra    ~movep8
  3198.  
  3199. ~movep5:                ;(d,An),Dn
  3200.     bsr    getdspadr
  3201.     CHKLIM
  3202.     bsr    getdreg            ;データレジスタオペランドを得る
  3203.     bmi    iladrerr
  3204.     SETREGH
  3205. ~movep8:
  3206.     move.w    (X_MOVEP,a6),d0        ;MOVEPを展開するCPUのビットが1
  3207.     and.w    (CPUTYPE,a6),d0
  3208.     beq    ~movep99        ;展開しない
  3209. ;movepのマクロ展開
  3210. ;ディスプレースメントが1ワードにおさまらないときanを変更する
  3211. ;(+側だけなのでaddq.l #8,anとsubq.l #8,anで挟んでディスプレースメントから8引けばよい)
  3212.     tst.w    (RPNLEN1,a1)
  3213.     bpl    ~movep99        ;dが定数でない
  3214. ;d7.w=0000_ddd_1_w_s_001_aaa
  3215.     moveq.l    #%0000_000_0_0_0_000_111,d0
  3216.     and.w    d7,d0            ;0000_000_0_0_0_000_aaa
  3217.     subq.w    #7,d0
  3218.     beq    ~movep99        ;a7は処理できない
  3219.     move.w    (RPNBUF1+2,a1),d2    ;d
  3220.     ext.l    d2            ;符号拡張しておく
  3221.     moveq.l    #0,d3            ;ゲタ
  3222. ;                -(SP)
  3223.     move.w    #%0100_0000_11_100_111,d0    ;MOVE.W SR,-(SP)
  3224.     move.w    #C000,d6
  3225.     and.w    (CPUTYPE,a6),d6
  3226.     bne    ~movep950
  3227. ;                -(SP)
  3228.     move.w    #%0100_0010_11_100_111,d0    ;MOVE.W CCR,-(SP)
  3229. ~movep950:
  3230.     bsr    wrt1wobj
  3231. ;d7.w=0000_ddd_1_w_s_001_aaa
  3232.     tst.b    d7            ;wをテスト
  3233.     bmi    ~movep91        ;w=1:write
  3234. ;w=0:read
  3235. ;MOVEP.wl (d,An),Dn
  3236. ;d7.w=0000_ddd_1_w_s_001_aaa
  3237. ~movep90:
  3238.     move.w    d7,d6                ;0000_ddd_1_w_s_001_aaa
  3239.     and.w    #%0000_111_000_000_111,d6    ;0000_ddd_000_000_aaa
  3240.     lsr.w    #8,d7
  3241.     lsr.w    #1,d7                ;0000_000_000_000_ddd
  3242.     or.w    #%1110_000_1_01_001_000,d7    ;LSL.W #8,Dn
  3243. ;d7.w=LSL.W #8,Dn
  3244.     bsr    ~movep90dsp        ;MOVE.B (d,An),Dn
  3245.     bsr    ~movep902dsp        ;LSL.W #8,Dn;MOVE.B (d+2,An),Dn
  3246.     bsr    getopsize
  3247.     subq.b    #SZ_LONG,d0
  3248.     bne    ~movep92        ;ロングでなければすべてワード
  3249. ;MOVEP.L (d,An),Dn
  3250. ~movep901:
  3251. ;            LSL.W #8,Dn    →    SWAP.W Dn
  3252.     eor.w    #%1110_000_1_01_001_000.eor.%0100100001000_000,d7    ;SWAP.W Dn
  3253.     bsr    ~movep902dsp        ;LSL.W #8,Dn;MOVE.B (d+4,An),Dn
  3254. ;            SWAP.W Dn    →    LSL.W #8,Dn
  3255.     eor.w    #%0100100001000_000.eor.%1110_000_1_01_001_000,d7    ;LSL.W #8,Dn
  3256.     bsr    ~movep902dsp        ;LSL.W #8,Dn;MOVE.B (d+6,An),Dn
  3257.     bra    ~movep92
  3258.  
  3259. ;dを2増やしてから,d7を出力して,MOVE.B (d,An),Dnを出力する
  3260. ~movep902dsp:
  3261.     addq.l    #2,d2
  3262.     move.w    d7,d0
  3263.     bsr    wrt1wobj        ;LSL.W #8,Dn
  3264. ;MOVE.B (d,An),Dnを出力する
  3265. ;d2.l=d
  3266. ;d6.w=0000_ddd_000_000_aaa
  3267. ~movep90dsp:
  3268.     move.w    d6,d0            ;0000_ddd_000_000_aaa
  3269.     move.w    d2,d1
  3270.     beq    ~movep90dsp0        ;ディスプレースメントが0
  3271.     ext.l    d1
  3272.     cmp.l    d2,d1
  3273.     beq    ~movep90dsp1        ;ディスプレースメントがオーバーフローしていない
  3274. ;ディスプレースメントがオーバーフローしている
  3275. ;020~060のときは(bd,An)を出力する
  3276.     move.w    #C020|C030|C040|C060,d0
  3277.     and.w    (CPUTYPE,a6),d0
  3278.     bne    ~movep90dsp2        ;020~060のときは(bd,An)を出力する
  3279. ;020~060ではないので,Anを8増やしてディスプレースメントを8減らす
  3280. ;d6.w=0000_ddd_000_000_aaa
  3281.     moveq.l    #%0000_000_000_000_111,d0
  3282.     and.w    d6,d0            ;0000_000_000_000_aaa
  3283. ;                Dn   .L   An
  3284.     or.w    #%0101_000_0_10_001_000,d0    ;ADDQ.L #8,An
  3285.     bsr    wrt1wobj
  3286.     moveq.l    #8,d3            ;ゲタ
  3287.     subq.l    #8,d2            ;d
  3288.     move.w    d6,d0            ;0000_ddd_000_000_aaa
  3289. ;MOVE.B (d,An),Dn
  3290. ;d0.w=0000_ddd_000_000_aaa
  3291. ~movep90dsp1:
  3292. ;             .B    Dn    (d,An)
  3293.     or.w    #%00_01_000_000_101_000,d0    ;MOVE.B (d,An),Dn
  3294.     bsr    wrt1wobj
  3295.     move.w    d2,d0            ;d
  3296.     bra    wrt1wobj
  3297.  
  3298. ;MOVE.B (An),Dn
  3299. ;d0.w=0000_ddd_000_000_aaa
  3300. ~movep90dsp0:
  3301. ;             .B    Dn     (An)
  3302.     or.w    #%00_01_000_000_010_000,d0    ;MOVE.B (An),Dn
  3303.     bra    wrt1wobj
  3304.  
  3305. ;MOVE.B Dn,(bd,An)
  3306. ;d6.w=0000_ddd_000_000_aaa
  3307. ~movep90dsp2:
  3308.     move.w    d6,d0            ;0000_ddd_000_000_aaa
  3309. ;             .B    Dn    (bd,An)
  3310.     or.w    #%00_01_000_000_110_000,d0    ;MOVE.B (bd,An),Dn
  3311. ;d0とfull formatの拡張ワードを出力して終わり
  3312. ~movep90dsp21:
  3313.     bsr    wrt1wobj
  3314. ;         D/A REGISTER W/L SCALE 1 BS IS BDSIZE 0 I/IS
  3315.     move.w    #%0____000_____0___00___1_0__1____11___0_000,d0
  3316.     bsr    wrt1wobj
  3317.     move.l    d2,d0
  3318.     bra    wrt1lobj
  3319.  
  3320. ;MOVE.B Dn,(bd,An)
  3321. ;d6.w=0000_ddd_000_000_aaa
  3322. ~movep91dsp2:
  3323.     move.w    d6,d0            ;0000_ddd_000_000_aaa
  3324.     ror.w    #7,d0            ;0000_aaa_000_0dd_d00
  3325.     lsr.b    #2,d0            ;0000_aaa_000_000_ddd
  3326. ;             .B (bd,An)   Dn
  3327.     or.w    #%00_01_000_110_000_000,d0    ;MOVE.B Dn,(bd,An)
  3328.     bra    ~movep90dsp21        ;d0とfull formatの拡張ワードを出力して終わり
  3329.  
  3330. ;MOVE.B Dn,(An)
  3331. ;d0.w=0000_ddd_000_000_aaa
  3332. ~movep91dsp0:
  3333.     ror.w    #7,d0            ;0000_aaa_000_0dd_d00
  3334.     lsr.b    #2,d0            ;0000_aaa_000_000_ddd
  3335. ;             .B   (An)     Dn
  3336.     or.w    #%00_01_000_010_000_000,d0    ;MOVE.B Dn,(An)
  3337.     bra    wrt1wobj
  3338.  
  3339. ;dを2増やして,d7.wを出力してから,MOVE.B Dn,(d,An)を出力する
  3340. ~movep912dsp:
  3341.     addq.l    #2,d2
  3342. ;d7.wを出力してから,MOVE.B Dn,(d,An)を出力する
  3343. ;d2.l=d
  3344. ;d6.w=0000_ddd_000_000_aaa
  3345. ~movep91dsp:
  3346.     move.w    d7,d0
  3347.     bsr    wrt1wobj        ;ROL.wl #8,Dn
  3348.     move.w    d6,d0
  3349.     move.w    d2,d1
  3350.     beq    ~movep91dsp0        ;ディスプレースメントが0
  3351.     ext.l    d1
  3352.     cmp.l    d2,d1
  3353.     beq    ~movep91dsp1        ;ディスプレースメントがオーバーフローしていない
  3354. ;ディスプレースメントがオーバーフローしている
  3355. ;020~060のときは(bd,An)を出力する
  3356.     move.w    #C020|C030|C040|C060,d0
  3357.     and.w    (CPUTYPE,a6),d0
  3358.     bne    ~movep91dsp2        ;020~060のときは(bd,An)を出力する
  3359. ;020~060ではないので,Anを8増やしてディスプレースメントを8減らす
  3360. ;d6.w=0000_ddd_000_000_aaa
  3361.     moveq.l    #%0000_000_000_000_111,d0
  3362.     and.w    d6,d0            ;0000_000_000_000_aaa
  3363. ;                Dn   .L   An
  3364.     or.w    #%0101_000_0_10_001_000,d0    ;ADDQ.L #8,An
  3365.     bsr    wrt1wobj
  3366.     moveq.l    #8,d3            ;ゲタ
  3367.     subq.l    #8,d2            ;d
  3368.     move.w    d6,d0            ;0000_ddd_000_000_aaa
  3369. ;MOVE.B Dn,(d16,An)
  3370. ;d0.w=0000_ddd_000_000_aaa
  3371. ~movep91dsp1
  3372.     ror.w    #7,d0            ;0000_aaa_000_0dd_d00
  3373.     lsr.b    #2,d0            ;0000_aaa_000_000_ddd
  3374. ;             .B  (d,An)   Dn
  3375.     or.w    #%00_01_000_101_000_000,d0    ;MOVE.B Dn,(d,An)
  3376.     bsr    wrt1wobj
  3377.     move.w    d2,d0            ;d
  3378.     bra    wrt1wobj
  3379.  
  3380. ;w=1:write
  3381. ;MOVEP.wl Dn,(d,An)
  3382. ;d7.w=0000_ddd_1_w_s_001_aaa
  3383. ~movep91:
  3384.     move.w    d7,d6            ;0000_ddd_1_w_s_001_aaa
  3385.     and.w    #%0000_111_000_000_111,d6    ;0000_ddd_000_000_aaa
  3386.     lsr.w    #8,d7
  3387.     lsr.w    #1,d7            ;0000_000_000_000_ddd
  3388.     bsr    getopsize
  3389.     subq.b    #SZ_LONG,d0
  3390.     beq    ~movep911        ;ロングでなければすべてワード
  3391. ;MOVEP.W Dn,(d,An)
  3392. ~movep910:
  3393.     or.w    #%1110_000_1_01_011_000,d7    ;ROL.W #8,Dn
  3394. ;d7.w=ROL.W #8,Dn
  3395.     bsr    ~movep91dsp        ;ROL.W #8,Dn;MOVE.B Dn,(d,An)
  3396.     bsr    ~movep912dsp        ;ROL.W #8,Dn;MOVE.B Dn,(d+2,An)
  3397.     bra    ~movep92
  3398.  
  3399. ;MOVEP.L Dn,(d,An)
  3400. ~movep911:
  3401.     or.w    #%1110_000_1_10_011_000,d7    ;ROL.L #8,Dn
  3402. ;d7.w=ROL.L #8,Dn
  3403.     bsr    ~movep91dsp        ;ROL.L #8,Dn;MOVE.B Dn,(d,An)
  3404.     bsr    ~movep912dsp        ;ROL.L #8,Dn;MOVE.B Dn,(d+2,An)
  3405.     bsr    ~movep912dsp        ;ROL.L #8,Dn;MOVE.B Dn,(d+4,An)
  3406.     bsr    ~movep912dsp        ;ROL.L #8,Dn;MOVE.B Dn,(d+6,An)
  3407. ~movep92:
  3408. ;MOVEP展開終わり
  3409. ;Anをずらしたときは元に戻す
  3410.     tst.w    d3
  3411.     beq    ~movep921
  3412.     moveq.l    #%0000_000_000_000_111,d0
  3413.     and.w    d6,d0            ;0000_000_000_000_aaa
  3414. ;                Dn   .L   An
  3415.     or.w    #%0101_000_1_10_001_000,d0    ;SUBQ.L #8,An
  3416.     bsr    wrt1wobj
  3417. ~movep921:
  3418. ;MOVE.W (SP)+,CCR
  3419. ;                (SP)+
  3420.     move.w    #%0100_0100_11_011_111,d0    ;MOVE.W (SP)+,CCR
  3421.     bra    wrt1wobj
  3422.  
  3423. ~movep99:
  3424.     move.w    #C060,d0
  3425.     or.w    d0,(SOFTFLAG,a6)
  3426.     and.w    (CPUTYPE,a6),d0
  3427.     beq    ~movep10
  3428.     bsr    softwarn
  3429. ~movep10:
  3430. ;ソフトエミュレーションなのでエラッタのチェックは不要
  3431.     bsr    getopsize        ;サイズを得る
  3432.     cmpi.b    #SZ_WORD,d0
  3433.     beq    ~movep9
  3434.     ori.w    #$0040,d7        ;.l
  3435. ~movep9:
  3436.     OPOUT
  3437.     move.b    #SZ_WORD,(RPNSIZE1,a1)    ;サイズは必ず.w
  3438.     bra    eadataout
  3439.  
  3440. ;----------------------------------------------------------------
  3441. getdspadr:
  3442.     movea.l    a4,a1
  3443.     bsr    geteamode        ;実効アドレスオペランドを得る
  3444.     cmp.w    #EA_DSPADR,d0
  3445.     beq    getdspadr1
  3446.     cmp.w    #EA_ADR,d0
  3447.     bne    iladrerr        ;(d,An)/(An)でなければエラー
  3448.     move.b    #EAD_DSPADR,(EADTYPE,a1)
  3449.     move.w    #-1,(RPNLEN1,a1)
  3450.     clr.l    (RPNBUF1,a1)        ;(An)→(0,An)
  3451. getdspadr1:
  3452.     move.w    (EACODE,a1),d1
  3453.     SETREGL
  3454.     rts
  3455.  
  3456. ;----------------------------------------------------------------
  3457. ;    moves    Rn,<ea>/<ea>,Rn        (68010/68020/68030/68040)
  3458. ~moves::
  3459.     bsr    getreg            ;レジスタオペランドを得る
  3460.     bmi    ~moves1
  3461.     ror.w    #4,d1            ;Rn,<ea>
  3462.     move.w    d1,d6
  3463.     or.w    #$0800,d6
  3464.     CHKLIM
  3465.     movea.l    a4,a1
  3466.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3467.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  3468.     beq    iladrerr
  3469.     bra    ~moves2
  3470.  
  3471. ~moves1:                ;<ea>,Rn
  3472.     movea.l    a4,a1
  3473.     bsr    geteamode        ;実効アドレスオペランドを得る
  3474.     and.w    #EG_MEM&EG_ALT,d0    ;メモリ・可変モード
  3475.     beq    iladrerr
  3476.     CHKLIM
  3477.     bsr    getreg            ;レジスタオペランドを得る
  3478.     bmi    iladrerr
  3479.     ror.w    #4,d1
  3480.     move.w    d1,d6
  3481. ~moves2:
  3482.     bsr    setopsize        ;オペレーションサイズのセット
  3483.     or.w    (EACODE,a1),d7
  3484.     bsr    f43g_fifth        ;5番目のチェック
  3485.     DSPOPOUT
  3486.     move.w    d6,d0
  3487.     bsr    wrt1wobj        ;特殊オペランドの出力
  3488.     bra    eadataout
  3489.  
  3490. ;----------------------------------------------------------------
  3491. ;    movec    Rc,Rn/Rn,Rc        (68010/68020/68030/68040)
  3492. ~movec::
  3493.     bsr    getreg            ;レジスタオペランドを得る
  3494.     bmi    ~movec1
  3495.     ori.w    #$0001,d7        ;Rn,Rc
  3496.     CHKLIM
  3497.     move.w    d1,d2
  3498.     bsr    getcreg
  3499.     bmi    iladrerr
  3500.     bra    ~movec2
  3501.  
  3502. ~movec1:                ;Rc,Rn
  3503. ;ColdFireのMOVECはwrite only
  3504.     tst.b    (CPUTYPE2,a6)
  3505.     bne    iladrerr
  3506.     bsr    getcreg
  3507.     bmi    iladrerr
  3508.     move.w    d1,d2
  3509.     CHKLIM
  3510.     bsr    getreg            ;レジスタオペランドを得る
  3511.     bmi    iladrerr
  3512.     exg.l    d1,d2
  3513. ~movec2:
  3514.     OPOUT                ;命令コードの出力
  3515.     ror.w    #4,d2
  3516.     or.w    d2,d1
  3517.     move.w    d1,d0
  3518.     bsr    wrt1wobj        ;特殊オペランドの出力
  3519.     rts
  3520.  
  3521. ;----------------------------------------------------------------
  3522. ;    bra/bsr/b<cc>     <label>
  3523. ~bcc::
  3524. ;68000/68010/5200/5300にはロングディスプレースメントはない
  3525.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  3526.     bne    ~bcc00
  3527.     move.w    #C000|C010,d0
  3528.     and.w    (CPUTYPE,a6),d0
  3529.     bne    ilsizeerr_000_bccl
  3530.     move.w    #C520|C530,d0
  3531.     and.w    (CPUTYPE,a6),d0
  3532.     bne    ilsizeerr_cf_bccl
  3533. ~bcc00:
  3534.     movea.l    a4,a1
  3535.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3536.     cmp.w    #EA_ABSL,d0
  3537.     bne    iladrerr        ;絶対ロングでなければエラー
  3538.     tst.w    (RPNLEN1,a1)
  3539.     bmi    ilrelerr_const        ;<label>が定数ならエラー
  3540.  
  3541.     tst.b    (CMDOPSIZE,a6)
  3542.     bpl    ~bcc_size        ;サイズが指定された
  3543.     tst.b    (BRATOJBRA,a6)
  3544.     bne    ~jbcc1            ;-bスイッチがあるなら bra→jbra
  3545.     move.w    #T_BRA,d0
  3546.     bsr    wrtobjd0w
  3547.     move.w    d7,d0            ;命令コード
  3548.     bsr    wrtd0w
  3549.  
  3550.     move.l    (EXTLEN,a6),d0
  3551.     addq.l    #2,d0
  3552.     add.l    d0,(LOCATION,a6)
  3553.     move.b    (EXTSIZE,a6),d0
  3554.     or.b    #ESZ_OPT,d0        ;(最適化対象)
  3555.     bra    ead_outrpn
  3556.  
  3557. ~bcc_size:
  3558.     move.w    #T_BRA,d0
  3559.     bsr    wrtobjd0w
  3560.     move.w    d7,d0            ;命令コード
  3561.     bsr    wrtd0w
  3562.     addq.l    #2,(LOCATION,a6)
  3563.     move.b    (CMDOPSIZE,a6),d0
  3564.     cmp.b    #SZ_SHORT,d0
  3565.     beq    ~bcc_size2
  3566.     tst.b    d0            ;cmp.b #SZ_BYTE,d0
  3567.     bne    ~bcc_size1
  3568.     move.b    #SZ_SHORT,(CMDOPSIZE,a6)    ;SZ_BYTE→SZ_SHORT
  3569.     bra    ~bcc_size2
  3570.  
  3571. ~bcc_size1:
  3572.     bsr    getdtsize        ;(ディスプレースメントサイズ指定あり)
  3573.     add.l    d0,(LOCATION,a6)
  3574. ~bcc_size2:
  3575.     move.b    (CMDOPSIZE,a6),d0
  3576.     bra    ead_outrpn
  3577.  
  3578. ;----------------------------------------------------------------
  3579. ;    jbra/jbsr/jb<cc> <label>
  3580. ~jbcc::
  3581.     movea.l    a4,a1
  3582.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3583.                     ;OPCに変更しない
  3584.     cmp.w    #EA_ABSL,d0
  3585.     bne    ~jbcc5            ;絶対ロングでなければjmp/jsrに決定
  3586.     tst.w    (RPNLEN1,a1)
  3587.     bmi    ilrelerr_const        ;<label>が定数ならエラー
  3588.     move.b    (CMDOPSIZE,a6),d0
  3589.     bmi    ~jbcc0_99        ;サイズ指定なし
  3590.     subq.b    #SZ_LONG,d0
  3591.     bne    ~bcc_size
  3592. ;jbra.l/jbsr.l/jbcc.l
  3593.     move.w    #$4EB9,d0        ;→jsr
  3594.     cmp.w    #$6100,d7
  3595.     beq    ~jbcc0_jsr        ;jbsr.l
  3596.     blo    ~jbcc0_jmp        ;jbra.l
  3597. ;jbcc.l
  3598.     move.w    d7,d0            ;命令コード
  3599.     eori.w    #$0106,d0        ;条件を逆にしてjmpを飛び越える
  3600.     bsr    wrt1wobj
  3601. ~jbcc0_jmp:
  3602.     move.w    #$4EF9,d0        ;→jmp
  3603. ~jbcc0_jsr:
  3604.     bsr    wrt1wobj
  3605.     bra    eadataout
  3606.  
  3607. ~jbcc0_99:
  3608. ~jbcc1:
  3609.     move.w    #T_JBRA,d0
  3610.     bsr    wrtobjd0w
  3611.     move.w    d7,d0            ;命令コード
  3612.     bsr    wrtd0w
  3613.     moveq.l    #4,d1            ;デフォルトが.wなら4バイト
  3614.     moveq.l    #ESZ_OPT|SZ_WORD,d0    ;(最適化対象)
  3615.     tst.b    (EXTSHORT,a6)
  3616.     beq    ~jbcc9
  3617.     moveq.l    #ESZ_OPT|SZ_LONG,d0    ;(最適化対象)
  3618.     moveq.l    #6,d1            ;jbra/jbsrは6バイト
  3619.     cmp.w    #$6100,d7
  3620.     bls    ~jbcc9
  3621.     moveq.l    #8,d1            ;jb<cc>は8バイト
  3622. ~jbcc9:
  3623.     add.l    d1,(LOCATION,a6)
  3624.     bra    ead_outrpn
  3625.  
  3626. ~jbcc5:                    ;絶対ロング以外のjbra/jbsrはjmp/jsrに決定
  3627.     and.w    #EG_CTRL,d0        ;制御モード
  3628.     beq    iladrerr
  3629.     move.w    d7,d0
  3630.     move.w    #$4E80,d7        ;(jsrの命令コード)
  3631.     cmp.w    #$6100,d0
  3632.     beq    ~jbcc7            ;jbsr → jsr
  3633.     bcs    ~jbcc6            ;jbra → jmp
  3634.     eori.w    #$0106,d0        ;b<cc> → b</cc> $+8 & jmp
  3635.     bsr    wrt1wobj        ;命令コードを出力する
  3636. ~jbcc6:
  3637.     move.w    #$4EC0,d7        ;(jmpの命令コード)
  3638. ~jbcc7:
  3639.     or.w    (EACODE,a1),d7
  3640.     bsr    f43g_fifth        ;5番目のチェック(不要?)
  3641.     DSPOPOUT
  3642.     bra    eadataout
  3643.  
  3644. ;----------------------------------------------------------------
  3645. ;    dbra/db<cc>    Dn,<label>
  3646. ~dbcc::
  3647.     bsr    getdreg            ;データレジスタオペランドを得る
  3648.     bmi    iladrerr
  3649.     SETREGL
  3650.     CHKLIM
  3651.     movea.l    a4,a1
  3652.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3653.     cmp.w    #EA_ABSL,d0
  3654.     bne    iladrerr        ;絶対ロングでなければエラー
  3655.     OPOUT
  3656.     tst.w    (RPNLEN1,a1)
  3657.     bmi    ilrelerr_const        ;<label>が定数ならエラー
  3658.     move.b    #EAD_DSPPC,(EADTYPE,a1)    ;(d,PC)と同じ処理を行う
  3659.     move.b    #SZ_WORD,(RPNSIZE1,a1)    ;サイズは必ず.w
  3660.     sf.b    (OPTIONALPC,a1)        ;OPCの処理が行われないようにする
  3661.     bra    eadataout
  3662.  
  3663. ;----------------------------------------------------------------
  3664. ;    trap    #xx
  3665. ~trap::    
  3666.     movea.l    a4,a1
  3667.     bsr    geteamode        ;実効アドレスオペランドを得る
  3668.     cmp.w    #EA_IMM,d0
  3669.     bne    iladrerr        ;#xxでなければエラー
  3670.     tst.w    (RPNLEN1,a1)
  3671.     bpl    ~trap_expr        ;式の値が未確定
  3672.     move.l    (RPNBUF1,a1),d0
  3673.     cmp.l    #$10,d0
  3674.     bcc    ilvalueerr        ;$10以上ならエラー
  3675.     or.w    d0,d7
  3676.     OPOUTrts
  3677.  
  3678. ~trap_expr:
  3679.     addq.l    #2,(LOCATION,a6)    ;式の場合
  3680.     move.w    #T_CODERPN|TCR_TRAP,d0
  3681.     bsr    wrtobjd0w
  3682.     move.w    d7,d0
  3683.     bsr    wrtd0w
  3684.     moveq.l    #0,d0            ;(サイズは無関係)
  3685.     bra    ead_outrpn
  3686.  
  3687. ;----------------------------------------------------------------
  3688. ;    bkpt    #xx            (68010/68020/68030/68040)
  3689. ~bkpt::
  3690.     movea.l    a4,a1
  3691.     bsr    geteamode        ;実効アドレスオペランドを得る
  3692.     cmp.w    #EA_IMM,d0
  3693.     bne    iladrerr        ;#xxでなければエラー
  3694.     tst.w    (RPNLEN1,a1)
  3695.     bpl    ~bkpt_expr        ;式の値が未確定
  3696.     move.l    (RPNBUF1,a1),d0
  3697.     cmp.l    #8,d0
  3698.     bcc    ilvalueerr        ;8以上ならエラー
  3699.     or.w    d0,d7
  3700.     OPOUTrts
  3701.  
  3702. ~bkpt_expr:
  3703.     addq.l    #2,(LOCATION,a6)    ;式の場合
  3704.     move.w    #T_CODERPN|TCR_BKPT,d0
  3705.     bsr    wrtobjd0w
  3706.     move.w    d7,d0
  3707.     bsr    wrtd0w
  3708.     moveq.l    #0,d0            ;(サイズは無関係)
  3709.     bra    ead_outrpn
  3710.  
  3711. ;----------------------------------------------------------------
  3712. ;    trap<cc>    #xx        (68020/68030/68040)
  3713. ~trapcc::
  3714.     bsr    gettrapccopr
  3715.     bra    eadataout
  3716.  
  3717. ;----------------------------------------------------------------
  3718. ;    trap<cc>,ftrap<cc>,ptrap<cc>のオペランドを得る
  3719. gettrapccopr:
  3720.     movea.l    (LINEPTR,a6),a0
  3721.     move.b    (a0),d0
  3722.     cmp.b    #'*',d0
  3723.     beq    gettrapccopr5
  3724.     cmp.b    #';',d0            ;拡張モードのコメント
  3725.     beq    gettrapccopr5
  3726.  
  3727.     movem.w    d6-d7,-(sp)
  3728.     bsr    encodeopr        ;オペランドをコード化する
  3729.     movem.w    (sp)+,d6-d7
  3730.     lea.l    (OPRBUF,a6),a0
  3731.     lea.l    (EABUF1,a6),a1
  3732.     tst.w    (a0)
  3733.     beq    gettrapccopr5        ;オペランドなし
  3734.     bsr    geteamode        ;実効アドレスオペランドを得る
  3735.     cmp.w    #EA_IMM,d0
  3736.     bne    iladrerr        ;#xxでなければエラー
  3737.     bsr    getopsize        ;サイズを得る
  3738.     addq.w    #1,d0            ;b2-b0:.w=%010/.l=%011
  3739.     or.w    d0,d7
  3740.     OPOUTrts
  3741.  
  3742. gettrapccopr5:                ;オペランドのないtrapcc
  3743.     tst.b    (CMDOPSIZE,a6)
  3744.     bpl    ilsizeerr_trapcc    ;サイズなしでなければエラー
  3745.     addq.l    #asm1skipofst,(4,sp)    ;スタック注意
  3746.                     ;行末のチェックは行わない
  3747.     lea.l    (EABUF1,a6),a1
  3748.     clr.b    (EADTYPE,a1)        ;オペランドはない
  3749.     ori.w    #$0004,d7
  3750.     OPOUTrts
  3751.  
  3752. ;----------------------------------------------------------------
  3753. ;    stop    #xx
  3754. ~stoprtd::
  3755.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  3756.     movea.l    a4,a1
  3757.     bsr    geteamode        ;実効アドレスオペランドを得る
  3758.     cmp.w    #EA_IMM,d0
  3759.     bne    iladrerr        ;#xxでなければエラー
  3760.     bsr    insigbitchksr
  3761.     OPOUT
  3762.     bra    eadataout
  3763.  
  3764. ;----------------------------------------------------------------
  3765. ;    rtd    #xx
  3766. ~rtd::
  3767.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  3768.     movea.l    a4,a1
  3769.     bsr    geteamode        ;実効アドレスオペランドを得る
  3770.     cmp.w    #EA_IMM,d0
  3771.     bne    iladrerr        ;#xxでなければエラー
  3772.     OPOUT
  3773.     bra    eadataout
  3774.  
  3775. ;----------------------------------------------------------------
  3776. ;    lpstop    #xx
  3777. ~lpstop::
  3778.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  3779.     movea.l    a4,a1
  3780.     bsr    geteamode        ;実効アドレスオペランドを得る
  3781.     cmp.w    #EA_IMM,d0
  3782.     bne    iladrerr        ;#xxでなければエラー
  3783.     bsr    insigbitchksr
  3784.     OPOUT
  3785.     move.w    #$01C0,d0
  3786.     bsr    wrt1wobj
  3787.     bra    eadataout
  3788.  
  3789. ;----------------------------------------------------------------
  3790. insigbitchksr:
  3791.     move.w    #$46C0,d0
  3792. ;d0:$44C0=ccr,$46C0=sr
  3793. insigbitchk:
  3794.     tst.w    (RPNLEN1,a1)
  3795.     bpl    insigbitchk2
  3796.     sub.w    #$4600,d0
  3797.     subx.w    d0,d0            ;$FFFF=ccr,$0000=sr
  3798.     clr.b    d0            ;$FF00=ccr,$0000=sr
  3799.     or.w    #$08E0,d0        ;$FFE0=ccr,$08E0=sr
  3800.     and.w    (RPNBUF1+2,a1),d0
  3801.     bne    insigbitwarn
  3802. ;000~010にはMがない
  3803.     move.w    #C020|C030|C040|C060|C520|C530|C540,d0
  3804.     and.w    (CPUTYPE,a6),d0
  3805.     bne    insigbitchk1
  3806.     btst.b    #12-8,(RPNBUF1+3-1,a1)    ;000~010にはMがない
  3807.     bne    insigbitwarn
  3808. insigbitchk1:
  3809. ;000~010と060とColdFireにはT0がない
  3810.     and.w    #C020|C030|C040,d0
  3811.     bne    insigbitchk2
  3812.     btst.b    #14-8,(RPNBUF1+3-1,a1)    ;000~010と060とColdFireにはT0がない
  3813.     bne    insigbitwarn
  3814. insigbitchk2:
  3815.     rts
  3816.  
  3817. ;----------------------------------------------------------------
  3818. ;    callm    #xx,<ea>        (68020)
  3819. ~callm::
  3820.     movea.l    a4,a1
  3821.     bsr    geteamode        ;実効アドレスオペランドを得る
  3822.     cmp.w    #EA_IMM,d0
  3823.     bne    iladrerr        ;#xxでなければエラー
  3824.     CHKLIM
  3825.     movea.l    a5,a1
  3826.     bsr    geteamode        ;実効アドレスオペランドを得る
  3827.     and.w    #EG_CTRL,d0        ;制御モード
  3828.     beq    iladrerr
  3829.     clr.b    (CMDOPSIZE,a6)        ;move.b #SZ_BYTE,(CMDOPSIZE,a6)
  3830.     or.w    (EACODE,a1),d7
  3831.     DSPOPOUT
  3832.     movea.l    a4,a1
  3833.     bsr    eadataout
  3834.     movea.l    a5,a1
  3835.     bra    eadataout
  3836.  
  3837. ;----------------------------------------------------------------
  3838. ;    rtm    Rn            (68020)
  3839. ~rtm::
  3840.     bsr    getreg            ;レジスタオペランドを得る
  3841.     bmi    iladrerr
  3842.     or.w    d1,d7
  3843.     OPOUTrts
  3844.  
  3845. ;----------------------------------------------------------------
  3846. ;    move16    (An)+,(An)+/xx,(An)/xx,(An)+/(An),xx/(An)+,xx    (68040)
  3847. ~move16::
  3848.     movea.l    a4,a1
  3849.     movea.l    a4,a2
  3850.     bsr    getabsl
  3851.     move.w    d0,d2
  3852.     swap.w    d2
  3853.     CHKLIM
  3854.     movea.l    a5,a1
  3855.     bsr    getabsl
  3856.     move.w    d0,d2
  3857.     cmp.l    #EA_INCADR<<16|EA_INCADR,d2
  3858.     beq    ~move16m
  3859.     cmp.w    #EA_ABSL,d2
  3860.     beq    ~move161
  3861.     or.w    #$0008,d7        ;xx,(An)/xx,(An)+
  3862.     swap.w    d2
  3863.     exg.l    a1,a2
  3864.     cmp.w    #EA_ABSL,d2
  3865.     bne    iladrerr
  3866. ~move161:                ;(An),xx/(An)+,xx
  3867.     swap.w    d2
  3868.     cmp.w    #EA_INCADR,d2
  3869.     beq    ~move162        ;(An)+
  3870.     cmp.w    #EA_ADR,d2
  3871.     bne    iladrerr
  3872.     or.w    #$0010,d7        ;(An)
  3873. ~move162:
  3874.     move.w    (EACODE,a2),d1
  3875.     SETREGL
  3876.     OPOUT
  3877.     bra    eadataout
  3878.  
  3879. ~move16m:                ;(An)+,(An)+
  3880.     or.w    #$0020,d7
  3881.     move.w    (EACODE,a4),d1
  3882.     SETREGL
  3883.     OPOUT                ;命令コードの出力
  3884.     move.w    (EACODE,a5),d0
  3885.     and.w    #$0007,d0
  3886.     ror.w    #4,d0
  3887.     or.w    #$8000,d0
  3888.     bra    wrt1wobj        ;特殊オペランドの出力
  3889.  
  3890. ;----------------------------------------------------------------
  3891. getabsl:
  3892.     movem.l    d2/a2,-(sp)
  3893.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  3894.     clr.b    (ABSLTOOPCCAN,a6)
  3895.     movem.l    (sp)+,d2/a2
  3896.     move.w    d0,d1
  3897.     and.w    #EA_ABSL|EA_ABSW,d0
  3898.     beq    getabsl9        ;xxxx.l/xxxx.wでなければなにもしない
  3899.     move.w    #EAC_ABSL,(EACODE,a1)
  3900.     move.b    #SZ_LONG,(RPNSIZE1,a1)
  3901.     move.w    #EA_ABSL,d1
  3902. getabsl9:
  3903.     bsr    f43g_fifth        ;5番目のチェック
  3904.     move.w    d1,d0
  3905.     rts
  3906.  
  3907.  
  3908. ;----------------------------------------------------------------
  3909. ;    浮動小数演算命令
  3910. ;----------------------------------------------------------------
  3911.  
  3912. ;----------------------------------------------------------------
  3913. ;    ftst    <ea>/FPn
  3914. ~ftst::
  3915.     move.w    d7,d6            ;コプロセッサ命令ワード
  3916.     move.w    #$F000,d7        ;命令コード
  3917.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  3918.  
  3919.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  3920.     move.w    (CPUTYPE,a6),d0
  3921.     and.w    (SOFTFLAG,a6),d0
  3922.     beq    ~ftst1
  3923.     bsr    softwarn
  3924. ~ftst1:
  3925.     DSPOPOUT
  3926.     move.w    d6,d0
  3927.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  3928.     move.b    (CMDOPSIZE,a6),d0
  3929.     bmi    fpeadataout
  3930.     cmp.b    #SZ_SINGLE,d0
  3931.     bcc    fpeadataout
  3932. ;.b/.w/.l
  3933.     bra    fpeadataout_nop
  3934.  
  3935. ;----------------------------------------------------------------
  3936. ;    fabs/fneg    <ea>,FPn/FPn,FPn/FPn
  3937. ~fabsneg::
  3938.     move.w    d7,d6            ;コプロセッサ命令ワード
  3939.     move.w    #$F000,d7        ;命令コード
  3940.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  3941.  
  3942.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  3943.     tst.w    (a0)
  3944.     beq    ~fabsneg1        ;オペランドは1つのみ
  3945.     CHKLIM
  3946.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  3947.     bmi    iladrerr
  3948.     lsl.w    #7,d1
  3949.     or.w    d1,d6
  3950.     bra    ~fabsneg2
  3951.  
  3952. ~fabsneg1:                ;オペランドが1つの場合
  3953.     btst.l    #14,d6
  3954.     bne    iladrerr        ;オペランドが実効アドレスならエラー
  3955.     move.w    d6,d1            ;ソースとデスティネーションFPレジスタは同じ
  3956.     and.w    #$1C00,d1
  3957.     lsr.w    #3,d1
  3958.     or.w    d1,d6
  3959. ~fabsneg2:
  3960.     move.w    (CPUTYPE,a6),d0
  3961.     and.w    (SOFTFLAG,a6),d0
  3962.     beq    ~fabsneg3
  3963.     bsr    softwarn
  3964. ~fabsneg3:
  3965.     DSPOPOUT
  3966.     move.w    d6,d0
  3967.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  3968.  
  3969.     move.w    #C060,d0
  3970.     and.w    (SOFTFLAG,a6),d0
  3971.     bne    fpeadataout
  3972.     move.b    (CMDOPSIZE,a6),d0
  3973.     bmi    fpeadataout
  3974.     cmp.b    #SZ_SINGLE,d0
  3975.     bcc    fpeadataout
  3976. ;.b/.w/.l
  3977.     bra    fpeadataout_nop
  3978.  
  3979. ;----------------------------------------------------------------
  3980. ;    fint/fintrz    <ea>,FPn/FPn,FPn/FPn
  3981. ~fint::
  3982. ;fint/fintrzは68040ではソフトウェアエミュレーション
  3983.     ori.w    #C040,(SOFTFLAG,a6)
  3984.     bra    ~funary
  3985.  
  3986. ;----------------------------------------------------------------
  3987. ;    f<unary>    <ea>,FPn/FPn,FPn/FPn
  3988. ~funarys::
  3989. ;fsinh/flognp1/fetoxm1/ftanh/fatan/fasin/fatanh/fsin/ftan/fetox/ftwotox/ftentox
  3990. ;flogn/flog10/flog2/fcosh/facos/fcos/fgetexp/fgetmanは68040,68060では
  3991. ;ソフトウェアエミュレーション
  3992.     ori.w    #C040|C060,(SOFTFLAG,a6)
  3993. ;    bra    ~funary
  3994.  
  3995. ;----------------------------------------------------------------
  3996. ;    f<unary>    <ea>,FPn/FPn,FPn/FPn
  3997. ~funary::
  3998.     move.w    d7,d6            ;コプロセッサ命令ワード
  3999.     move.w    #$F000,d7        ;命令コード
  4000.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4001.  
  4002.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  4003.     tst.w    (a0)
  4004.     beq    ~funary1        ;オペランドは1つのみ
  4005.     CHKLIM
  4006.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4007.     bmi    iladrerr
  4008.     lsl.w    #7,d1
  4009.     or.w    d1,d6
  4010.     bra    ~funary2
  4011.  
  4012. ~funary1:                ;オペランドが1つの場合
  4013.     btst.l    #14,d6
  4014.     bne    iladrerr        ;オペランドが実効アドレスならエラー
  4015.     move.w    d6,d1            ;ソースとデスティネーションFPレジスタは同じ
  4016.     and.w    #$1C00,d1
  4017.     lsr.w    #3,d1
  4018.     or.w    d1,d6
  4019. ~funary2:
  4020.     move.w    (CPUTYPE,a6),d0
  4021.     and.w    (SOFTFLAG,a6),d0
  4022.     beq    ~funary3
  4023.     bsr    softwarn
  4024. ~funary3:
  4025.     DSPOPOUT
  4026.     move.w    d6,d0
  4027.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4028.     move.w    #C060,d0
  4029.     and.w    (SOFTFLAG,a6),d0
  4030.     bne    fpeadataout
  4031.     bra    fpeadataout_nop
  4032.  
  4033. ;----------------------------------------------------------------
  4034. ;    fcmp    <ea>,FPn/FPn,FPn
  4035. ~fcmp::
  4036.     move.w    d7,d6            ;コプロセッサ命令ワード
  4037.     move.w    #$F000,d7        ;命令コード
  4038.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4039.  
  4040.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  4041.     CHKLIM
  4042.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4043.     bmi    iladrerr
  4044.     lsl.w    #7,d1
  4045.     or.w    d1,d6
  4046.     move.w    (CPUTYPE,a6),d0
  4047.     and.w    (SOFTFLAG,a6),d0
  4048.     beq    ~fcmp1
  4049.     bsr    softwarn
  4050. ~fcmp1:
  4051.     DSPOPOUT
  4052.     move.w    d6,d0
  4053.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4054.  
  4055.     move.w    #C060,d0
  4056.     and.w    (SOFTFLAG,a6),d0
  4057.     bne    fpeadataout
  4058.     move.b    (CMDOPSIZE,a6),d0
  4059.     bmi    fpeadataout
  4060.     cmp.b    #SZ_SINGLE,d0
  4061.     bcc    fpeadataout
  4062. ;.b/.w/.l
  4063.     bra    fpeadataout_nop
  4064.  
  4065. ;----------------------------------------------------------------
  4066. ;    fsgldiv/fsglmul    <ea>,FPn/FPn,FPn
  4067. ~fsgl::
  4068. ;fsgldiv,fsglmulは68040ではソフトウェアエミュレーション
  4069.     ori.w    #C040,(SOFTFLAG,a6)
  4070. ;    bra    ~fopr
  4071.  
  4072. ;----------------------------------------------------------------
  4073. ;    f<opr>    <ea>,FPn/FPn,FPn
  4074. ~fopr::
  4075.     move.w    d7,d6            ;コプロセッサ命令ワード
  4076.     move.w    #$F000,d7        ;命令コード
  4077.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4078.  
  4079.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  4080.     CHKLIM
  4081.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4082.     bmi    iladrerr
  4083.     lsl.w    #7,d1
  4084.     or.w    d1,d6
  4085.     move.w    (CPUTYPE,a6),d0
  4086.     and.w    (SOFTFLAG,a6),d0
  4087.     beq    ~fopr1
  4088.     bsr    softwarn
  4089. ~fopr1:
  4090.     DSPOPOUT
  4091.     move.w    d6,d0
  4092.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4093.     move.w    #C060,d0
  4094.     and.w    (SOFTFLAG,a6),d0
  4095.     bne    fpeadataout
  4096. fpeadataout_nop:
  4097. ;F43G対策
  4098.     tst.b    (F43GTEST,a6)
  4099.     beq    fpeadataout
  4100.     bsr    fpeadataout
  4101.     bsr    flushobj        ;GETFPTRが正しい値を返すために必要
  4102. ;コプロセッサ命令の直後にT_NOPDEATHを出力しておく
  4103.     move.l    a0,-(sp)        ;a0を破壊しないこと
  4104.     movea.l    (F43GPTR,a6),a0
  4105.     GETFPTR    TEMPFILPTR,d0        ;現在のファイルポインタ
  4106.     move.l    d0,(8,a0)        ;T_NOPDEATHを挿入した位置
  4107.     ori.b    #%00001,(12,a0)        ;1番目の命令に該当する
  4108.     movea.l    (sp)+,a0
  4109.     move.w    #T_NOPDEATH+1,d0
  4110.     bsr    wrtobjd0w
  4111.     move.w    #$4E71,d0        ;NOP
  4112.     bsr    wrtd0w
  4113.     addq.l    #2,(LOCATION,a6)
  4114.     rts
  4115.  
  4116. ;----------------------------------------------------------------
  4117. ;    fsincos    <ea>,FPc:FPs/FPn,FPc:FPs
  4118. ~fsincos::
  4119.     move.w    d7,d6            ;コプロセッサ命令ワード
  4120.     move.w    #$F000,d7        ;命令コード
  4121.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4122.  
  4123.     bsr    getfpopr        ;<ea>/FPオペランドを得る
  4124.     CHKLIM
  4125.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4126.     bmi    iladrerr
  4127.     or.w    d1,d6            ;FPc
  4128.     cmp.w    #':'|OT_CHAR,(a0)+
  4129.     bne    iladrerr
  4130.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4131.     bmi    iladrerr
  4132.     lsl.w    #7,d1            ;FPs
  4133.     or.w    d1,d6
  4134.     move.w    #C040|C060,d0
  4135.     or.w    d0,(SOFTFLAG,a6)
  4136.     and.w    (CPUTYPE,a6),d0
  4137.     beq    ~fsincos1
  4138.     bsr    softwarn
  4139. ~fsincos1:
  4140.     DSPOPOUT
  4141.     move.w    d6,d0
  4142.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4143.     bra    fpeadataout
  4144.  
  4145. ;----------------------------------------------------------------
  4146. ;    浮動小数点実効アドレス/データレジスタオペランドを得る
  4147. getfpopr:
  4148.     movea.l    a4,a1
  4149.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4150.     beq    getfpopr5
  4151.     or.w    #$4000,d6        ;<ea>
  4152.     bsr    getfpeamode        ;実効アドレスオペランドを得る
  4153.     and.w    #EG_DATA,d0        ;データモード
  4154.     beq    iladrerr
  4155.     or.w    (EACODE,a1),d7
  4156.     bra    setfpopsize        ;浮動小数点オペレーションサイズのセット
  4157.  
  4158. getfpopr5:                ;FPn
  4159.     move.b    #EAD_NONE,(EADTYPE,a1)    ;データは不要
  4160.     ror.w    #6,d1
  4161.     or.w    d1,d6            ;ソースレジスタのセット
  4162.     move.b    (CMDOPSIZE,a6),d0
  4163.     bmi    getfpopr6
  4164.     cmp.b    #SZ_EXTEND,d0
  4165.     bne    ilsizeerr_fpn        ;.x以外のサイズはエラー
  4166. getfpopr6:
  4167.     rts
  4168.  
  4169. ;----------------------------------------------------------------
  4170. ;    fmove    FPn,FPn/<ea>,FPn/FPn,<ea>/FPn,<ea>{Dn}/FPn,<ea>{#x}/<ea>,FPcr/FPcr,<ea>
  4171. ~fmove::
  4172.     move.w    d7,d6            ;コプロセッサ命令ワード
  4173.     move.w    #$F000,d7        ;命令コード
  4174.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4175.  
  4176.     move.w    (a0),d0
  4177.     cmp.w    #REG_FPCR|OT_REGISTER,d0
  4178.     bcs    ~fmove1
  4179.     cmp.w    #REG_FPIAR|OT_REGISTER,d0
  4180.     bls    ~fmove_frcr        ;fmove FPcr,<ea>
  4181. ~fmove1:
  4182.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4183.     beq    ~fmove5            ;fmove FPn,<ea>/FPn
  4184.                     ;fmove <ea>,FPn/FPcr
  4185.     movea.l    a4,a1
  4186.     or.w    #$4000,d6        ;<ea>
  4187.     bsr    getfpeamode        ;実効アドレスオペランドを得る
  4188.     move.w    d0,d2
  4189.     CHKLIM
  4190.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4191.     bmi    ~fmove_tocr        ;fmove <ea>,FPcr
  4192.  
  4193.     lsl.w    #7,d1            ;fmove <ea>,FPn
  4194.     or.w    d1,d6
  4195.     and.w    #EG_DATA,d2        ;データモード
  4196.     beq    iladrerr
  4197.     or.w    (EACODE,a1),d7
  4198.     bsr    setfpopsize        ;浮動小数点オペレーションサイズのセット
  4199.     move.w    (CPUTYPE,a6),d0
  4200.     and.w    (SOFTFLAG,a6),d0
  4201.     beq    ~fmove10
  4202.     bsr    softwarn
  4203. ~fmove10:
  4204.     DSPOPOUT
  4205.     move.w    d6,d0
  4206.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4207.     move.w    #C060,d0
  4208.     and.w    (SOFTFLAG,a6),d0
  4209.     bne    fpeadataout
  4210.     move.b    (CMDOPSIZE,a6),d0
  4211.     bmi    fpeadataout
  4212.     cmp.b    #SZ_SINGLE,d0
  4213.     bcc    fpeadataout
  4214. ;.b/.w/.l
  4215.     bra    fpeadataout_nop
  4216.  
  4217. ~fmove5:                ;fmove FPn,<ea>/FPn
  4218.     ror.w    #6,d1
  4219.     or.w    d1,d6            ;ソースレジスタのセット
  4220.     CHKLIM
  4221.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4222.     beq    ~fmove8            ;fmove FPn,FPn
  4223.  
  4224.     lsr.w    #3,d6            ;fmove FPn,<ea>
  4225.     and.w    #$0380,d6
  4226.     or.w    #$6000,d6        ;コプロセッサ命令ワード
  4227.     movea.l    a4,a1
  4228.     bsr    getfpeamode_noopc    ;実効アドレスオペランドを得る
  4229.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  4230.     beq    iladrerr
  4231.     or.w    (EACODE,a1),d7
  4232.     bsr    setfpopsize        ;浮動小数点オペレーションサイズのセット
  4233.     cmpi.b    #SZ_PACKED,(CMDOPSIZE,a6)
  4234.     bne    ~fmove6
  4235.     bsr    getkfactor        ;.pの場合,kファクタを得る
  4236. ~fmove6:
  4237.     move.w    (CPUTYPE,a6),d0
  4238.     and.w    (SOFTFLAG,a6),d0
  4239.     beq    ~fmove11
  4240.     bsr    softwarn
  4241. ~fmove11:
  4242.     DSPOPOUT
  4243.     move.w    d6,d0
  4244.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4245.     bra    fpeadataout
  4246.  
  4247. ~fmove8:                ;fmove FPn,FPn
  4248.     lsl.w    #7,d1
  4249.     or.w    d1,d6
  4250.     move.b    (CMDOPSIZE,a6),d0
  4251.     bmi    ~fmove9
  4252.     cmp.b    #SZ_EXTEND,d0
  4253.     bne    ilsizeerr_fpn        ;.x以外のサイズはエラー
  4254. ~fmove9:
  4255.     OPOUT
  4256.     move.w    d6,d0
  4257.     bra    wrt1wobj        ;コプロセッサ命令ワードの出力
  4258.  
  4259. ~fmove_frcr:                ;fmove FPcr,<ea>
  4260.     move.w    #$A000,d6        ;コプロセッサ命令ワード
  4261.     addq.l    #2,a0
  4262.     sub.w    #REG_FPCR|OT_REGISTER,d0
  4263.     move.w    #$1000,d1
  4264.     lsr.w    d0,d1            ;FP制御レジスタの選択
  4265.     or.w    d1,d6
  4266.     move.b    (CMDOPSIZE,a6),d0
  4267.     bmi    ~fmove_frcr1
  4268.     cmp.b    #SZ_LONG,d0
  4269.     bne    ilsizeerr_fpcr        ;.l以外のサイズはエラー
  4270. ~fmove_frcr1:
  4271.     move.b    #SZ_LONG,(CMDOPSIZE,a6)
  4272.     CHKLIM
  4273.     movea.l    a4,a1
  4274.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4275.     cmp.w    #EA_AN,d0
  4276.     bne    ~fmove_frcr2
  4277.     cmp.w    #$A400,d6        ;アドレスレジスタ直接が使えるのはFPIARのみ
  4278.     bne    iladrerr
  4279.     bra    ~fmove_frcr3
  4280.  
  4281. ~fmove_frcr2:
  4282.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  4283.     beq    iladrerr
  4284. ~fmove_frcr3:
  4285.     or.w    (EACODE,a1),d7
  4286.     bsr    f43g_fourth        ;4番目と5番目のチェック
  4287.     DSPOPOUT
  4288.     move.w    d6,d0
  4289.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4290.     bra    eadataout
  4291.  
  4292. ~fmove_tocr:                ;fmove <ea>,FPcr
  4293.     move.w    #$8000,d6        ;コプロセッサ命令ワード
  4294.     move.w    (a0)+,d0
  4295.     sub.w    #REG_FPCR|OT_REGISTER,d0
  4296.     bcs    iloprerr
  4297.     cmp.w    #REG_FPIAR-REG_FPCR,d0
  4298.     bhi    iloprerr        ;オペランドがFPCR/FPSR/FPIARでない
  4299.     move.w    #$1000,d1
  4300.     lsr.w    d0,d1            ;FP制御レジスタの選択
  4301.     or.w    d1,d6
  4302.     move.b    (CMDOPSIZE,a6),d0
  4303.     bmi    ~fmove_tocr1
  4304.     cmp.b    #SZ_LONG,d0
  4305.     bne    ilsizeerr_fpcr        ;.l以外のサイズはエラー
  4306. ~fmove_tocr1:
  4307.     move.b    #SZ_LONG,(CMDOPSIZE,a6)
  4308.     cmp.w    #EA_AN,d2
  4309.     bne    ~fmove_tocr2
  4310.     cmp.w    #$8400,d6        ;アドレスレジスタ直接が使えるのはFPIARのみ
  4311.     bne    iladrerr
  4312. ~fmove_tocr2:
  4313.     or.w    (EACODE,a1),d7
  4314.     DSPOPOUT
  4315.     move.w    d6,d0
  4316.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4317.     bra    fpeadataout
  4318.  
  4319. ;----------------------------------------------------------------
  4320. ;    fmovem    <list>,<ea>/Dn,<ea>/<ea>,<list>/<ea>,Dn
  4321. ~fmovem::
  4322.     move.w    d7,d6            ;コプロセッサ命令ワード
  4323.     move.w    #$F000,d7        ;命令コード
  4324.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4325.  
  4326.     bsr    getfpreglist        ;FPデータレジスタリストオペランドを得る
  4327.     beq    ~fmovem6
  4328.     bsr    getfpcreglist        ;FP制御レジスタリストオペランドを得る
  4329.     beq    ~fmovem_c5
  4330.     bsr    getdreg            ;データレジスタオペランドを得る
  4331.     beq    ~fmovem5
  4332.  
  4333.     movea.l    a4,a1            ;<ea>,<list>/Dn
  4334.     bsr    getfpeamode        ;実効アドレスオペランドを得る
  4335.     move.w    d0,-(sp)
  4336.     CHKLIM
  4337.     bsr    getfpcreglist        ;FP制御レジスタリストオペランドを得る
  4338.     beq    ~fmovem_c1
  4339.     and.w    #EG_CTRL|EA_INCADR,(sp)+    ;制御モードまたは(An)+
  4340.     beq    iladrerr
  4341.     bsr    getfpreglist        ;FPデータレジスタリストオペランドを得る
  4342.     beq    ~fmovem2
  4343.     bsr    getdreg            ;データレジスタオペランドを得る
  4344.     bne    iladrerr
  4345. ~fmovem1:                ;<ea>,Dn 動的レジスタリスト
  4346.     ori.w    #C040|C060,(SOFTFLAG,a6)
  4347.     lsl.w    #4,d1
  4348.     or.w    d1,d6
  4349.     or.w    #$1800,d6
  4350.     bra    ~fmovem9
  4351.  
  4352. ~fmovem2:                ;<ea>,<list> 静的レジスタリスト
  4353.     or.w    d1,d6
  4354.     or.w    #$1000,d6
  4355.     bra    ~fmovem9
  4356.  
  4357. ~fmovem5:                ;Dn,<ea> 動的レジスタリスト
  4358.     ori.w    #C040|C060,(SOFTFLAG,a6)
  4359.     move.w    d1,(EACODE,a4)
  4360.     lsl.w    #4,d1
  4361.     or.w    d1,d6
  4362.     or.w    #$3800,d6
  4363.     CHKLIM
  4364.     bsr    getfpcreglist        ;FP制御レジスタリストオペランドを得る
  4365.     bne    ~fmovem7
  4366.     clr.w    (SOFTFLAG,a6)
  4367.     movea.l    a4,a1            ;Dn,<list> だった場合
  4368.     move.b    #EAD_NONEREG,(EADTYPE,a1)
  4369.     move.w    #EA_DN,-(sp)
  4370.     bra    ~fmovem_c1
  4371.  
  4372. ~fmovem6:                ;<list>,<ea> 静的レジスタリスト
  4373.     or.w    d1,d6
  4374.     or.w    #$3000,d6
  4375.     CHKLIM
  4376. ~fmovem7:
  4377.     movea.l    a4,a1
  4378.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4379.     move.w    d0,d2
  4380.     and.w    #EG_CTRL&EG_ALT,d2    ;制御・可変モード
  4381.     bne    ~fmovem9
  4382.     cmp.w    #EA_DECADR,d0        ;-(An)
  4383.     bne    iladrerr
  4384.     and.w    #.not.$1000,d6
  4385.     btst.l    #11,d6
  4386.     bne    ~fmovem9
  4387.     moveq.l    #8-1,d2            ;静的レジスタリストの場合は反転する
  4388. ~fmovem8:
  4389.     roxl.b    #1,d6
  4390.     roxr.b    #1,d1
  4391.     dbra    d2,~fmovem8
  4392.     move.b    d1,d6
  4393. ~fmovem9:
  4394.     move.b    (CMDOPSIZE,a6),d0
  4395.     bmi    ~fmovem10
  4396.     cmp.b    #SZ_EXTEND,d0
  4397.     bne    ilsizeerr_fmovemfpn    ;.xでなければエラー
  4398. ~fmovem10:
  4399.     or.w    (EACODE,a1),d7
  4400.     move.w    (CPUTYPE,a6),d0
  4401.     and.w    (SOFTFLAG,a6),d0
  4402.     beq    ~fmovem11
  4403.     bsr    softwarn
  4404. ~fmovem11:
  4405.     bsr    f43g_fourth        ;4番目と5番目のチェック
  4406.     DSPOPOUT            ;命令コードの出力
  4407.     move.w    d6,d0
  4408.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4409.     bra    eadataout
  4410.  
  4411. ~fmovem_c1:                ;<ea>,FPcr
  4412.     move.w    #$8000,d6        ;コプロセッサ命令ワード
  4413.     or.w    d1,d6
  4414.     move.b    (CMDOPSIZE,a6),d0
  4415.     bmi    ~fmovem_c2
  4416.     cmp.b    #SZ_LONG,d0
  4417.     bne    ilsizeerr_fmovemfpcr    ;.l以外のサイズはエラー
  4418. ~fmovem_c2:
  4419.     move.w    (sp)+,d0
  4420.     cmp.w    #EA_DN,d0
  4421.     beq    ~fmovem_c8
  4422.     cmp.w    #EA_AN,d0
  4423.     beq    ~fmovem_c9
  4424.     cmp.w    #EA_IMM,d0
  4425.     bne    ~fmovem_c7
  4426.     cmp.b    (EAIMMCNT,a1),d2    ;イミディエイトの場合
  4427.     bne    iloprerr        ;データ数とレジスタ数が一致しなければエラー
  4428. ;2個以上のFPcrに対するfmovem.l #imm,FPcrはソフトウェアエミュレーション
  4429.     tst.b    d2
  4430.     beq    ~fmovem_c201
  4431.     ori.w    #C040|C060,(SOFTFLAG,a6)
  4432. ~fmovem_c201:
  4433.     add.b    #SZ_SINGLE,d2
  4434.     move.b    d2,(CMDOPSIZE,a6)
  4435.     bra    ~fmovem_c7
  4436.  
  4437. ~fmovem_c5:                ;FPcr,<ea>
  4438.     move.w    #$A000,d6        ;コプロセッサ命令ワード
  4439.     or.w    d1,d6
  4440.     move.b    (CMDOPSIZE,a6),d0
  4441.     bmi    ~fmovem_c6
  4442.     cmp.b    #SZ_LONG,d0
  4443.     bne    ilsizeerr        ;.l以外のサイズはエラー
  4444. ~fmovem_c6:
  4445.     move.b    #SZ_LONG,(CMDOPSIZE,a6)
  4446.     CHKLIM
  4447.     movea.l    a4,a1
  4448.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4449.     cmp.w    #EA_DN,d0
  4450.     beq    ~fmovem_c8
  4451.     cmp.w    #EA_AN,d0
  4452.     beq    ~fmovem_c9
  4453.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  4454.     beq    iladrerr
  4455. ~fmovem_c7:
  4456.     or.w    (EACODE,a1),d7
  4457.     move.w    (CPUTYPE,a6),d0
  4458.     and.w    (SOFTFLAG,a6),d0
  4459.     beq    ~fmovem_c10
  4460.     bsr    softwarn
  4461. ~fmovem_c10:
  4462.     bsr    f43g_fourth        ;4番目と5番目のチェック
  4463.     DSPOPOUT
  4464.     move.w    d6,d0
  4465.     bsr    wrt1wobj        ;コプロセッサ命令ワードの出力
  4466.     bra    fpeadataout
  4467.  
  4468. ~fmovem_c8:                ;データレジスタ直接の場合
  4469.     move.w    d6,d0            ;データレジスタ直接が使えるのは
  4470.     and.w    #$1C00,d0        ;レジスタが1つのときのみ
  4471.     move.w    d0,d1
  4472.     subq.w    #1,d1
  4473.     and.w    d1,d0
  4474.     beq    ~fmovem_c7
  4475.     bra    iladrerr
  4476.  
  4477. ~fmovem_c9::                ;アドレスレジスタ直接の場合
  4478.     move.w    d6,d0
  4479.     and.w    #$1C00,d0
  4480.     cmp.w    #$0400,d0        ;アドレスレジスタ直接が使えるのはFPIARのみ
  4481.     beq    ~fmovem_c7
  4482.     bra    iladrerr
  4483.  
  4484. ;----------------------------------------------------------------
  4485. ;    fmovecr    #cc,FPn
  4486. ~fmovecr::
  4487.     move.w    d7,d6            ;コプロセッサ命令ワード
  4488.     move.w    #$F000,d7        ;命令コード
  4489.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4490.  
  4491.     movea.l    a4,a1
  4492.     bsr    geteamode        ;実効アドレスオペランドを得る
  4493.     cmp.w    #EA_IMM,d0
  4494.     bne    iladrerr        ;#xxでなければエラー
  4495.     tst.w    (RPNLEN1,a1)
  4496.     bpl    exprerr            ;定数が得られなければエラー
  4497.     move.l    (RPNBUF1,a1),d1
  4498.     cmp.l    #$7F,d1            ;ROMオフセットは$00~$7F
  4499.     bhi    ilvalueerr
  4500.     or.w    d1,d6
  4501.     CHKLIM
  4502.     bsr    getfpreg        ;浮動小数点データレジスタを得る
  4503.     bmi    iladrerr
  4504.     lsl.w    #7,d1
  4505.     or.w    d1,d6
  4506. ;fmovecrはソフトウェアエミュレーション
  4507.     move.w    #C040|C060,d0
  4508.     or.w    d0,(SOFTFLAG,a6)
  4509.     and.w    (CPUTYPE,a6),d0
  4510.     beq    ~fmovecr1
  4511.     bsr    softwarn
  4512. ~fmovecr1:
  4513.     OPOUT                ;命令コードの出力
  4514.     move.w    d6,d0
  4515.     bra    wrt1wobj        ;コプロセッサ命令ワードの出力
  4516.  
  4517. ;----------------------------------------------------------------
  4518. ;    fnop
  4519. ~fnop::
  4520.     or.w    (FPCPID,a6),d7        ;コプロセッサID
  4521.     OPOUT                ;命令コードの出力
  4522.     addq.l    #asm1skipofst,(sp)    ;行末のチェックは行わない
  4523.     moveq.l    #0,d0
  4524.     bra    wrt1wobj
  4525.  
  4526. ;----------------------------------------------------------------
  4527. ;    fb<cc>    <label>
  4528. ~fbcc::
  4529.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4530. ~cpbcc:
  4531.     or.w    d0,d7
  4532.     movea.l    a4,a1
  4533.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4534.     cmp.w    #EA_ABSL,d0
  4535.     bne    iladrerr        ;絶対ロングでなければエラー
  4536.     tst.w    (RPNLEN1,a1)
  4537.     bmi    ilrelerr_const        ;<label>が定数ならエラー
  4538.  
  4539.     move.w    #T_CPBRA,d0
  4540.     bsr    wrtobjd0w
  4541.     move.w    d7,d0            ;命令コード
  4542.     bsr    wrtd0w
  4543.     move.b    (CMDOPSIZE,a6),d0
  4544.     bpl    ~cpbcc_size        ;サイズが指定された
  4545.     move.l    (EXTLEN,a6),d0
  4546.     addq.l    #2,d0
  4547.     add.l    d0,(LOCATION,a6)
  4548.     move.b    (EXTSIZE,a6),d0
  4549.     or.b    #ESZ_OPT,d0        ;(最適化対象)
  4550.     bra    ead_outrpn
  4551.  
  4552. ~cpbcc_size:
  4553.     bsr    getdtsize
  4554.     addq.l    #2,d0
  4555.     add.l    d0,(LOCATION,a6)
  4556.     move.b    (CMDOPSIZE,a6),d0
  4557.     bra    ead_outrpn
  4558.  
  4559. ;----------------------------------------------------------------
  4560. ;    fdb<cc>    Dn,<label>
  4561. ~fdbcc::
  4562.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4563. ~cpdbcc:
  4564.     move.w    d7,d6            ;コプロセッサ条件ワード
  4565.     move.w    #$F048,d7        ;命令コード
  4566.     or.w    d0,d7
  4567.     bsr    getdreg            ;データレジスタオペランドを得る
  4568.     bmi    iladrerr
  4569.     SETREGL
  4570.     CHKLIM
  4571.     movea.l    a4,a1
  4572.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4573.     cmp.w    #EA_ABSL,d0
  4574.     bne    iladrerr        ;絶対ロングでなければエラー
  4575. ;fdbccは68060ではソフトウェアエミュレーション
  4576. ;cpdbccもここを通るがこのままでよい
  4577.     move.w    #C060,d0
  4578.     or.w    d0,(SOFTFLAG,a6)
  4579.     and.w    (CPUTYPE,a6),d0
  4580.     beq    ~fdbcc1
  4581.     bsr    softwarn
  4582. ~fdbcc1:
  4583.     OPOUT                ;命令コードの出力
  4584.     move.w    d6,d0
  4585.     bsr    wrt1wobj        ;コプロセッサ条件ワードの出力
  4586.     tst.w    (RPNLEN1,a1)
  4587.     bmi    ilrelerr_const        ;<label>が定数ならエラー
  4588.     move.b    #EAD_DSPPC,(EADTYPE,a1)    ;(d,PC)と同じ処理を行う
  4589.     move.b    #SZ_WORD,(RPNSIZE1,a1)    ;サイズは必ず.w
  4590.     sf.b    (OPTIONALPC,a1)        ;OPCの処理が行われないようにする
  4591.     bra    eadataout
  4592.  
  4593. ;----------------------------------------------------------------
  4594. ;    frestore    <ea>
  4595. ~frestore::
  4596.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4597. ~cprestore:
  4598.     or.w    d0,d7
  4599.     move.w    #EG_CTRL|EA_INCADR,d6    ;制御モードまたは(An)+
  4600.     bra    ~cpsave1
  4601.  
  4602. ;----------------------------------------------------------------
  4603. ;    fsave    <ea>
  4604. ~fsave::
  4605.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4606. ~cpsave:
  4607.     or.w    d0,d7
  4608.     move.w    #(EG_CTRL&EG_ALT)|EA_DECADR,d6    ;制御・可変モードまたは-(An)
  4609. ~cpsave1:
  4610.     movea.l    a4,a1
  4611.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4612.     and.w    d6,d0
  4613.     beq    iladrerr
  4614.     or.w    (EACODE,a1),d7
  4615.     DSPOPOUT
  4616.     bra    eadataout
  4617.  
  4618. ;----------------------------------------------------------------
  4619. ;    fs<cc>    <ea>
  4620. ~fscc::
  4621.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4622. ~cpscc:
  4623.     move.w    d7,d6            ;コプロセッサ条件ワード
  4624.     move.w    #$F040,d7        ;命令コード
  4625.     or.w    d0,d7
  4626.     movea.l    a4,a1
  4627.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4628.     and.w    #EG_DATA&EG_ALT,d0    ;データ・可変モード
  4629.     beq    iladrerr
  4630.     or.w    (EACODE,a1),d7
  4631.     move.w    (X_FSCC,a6),d0        ;FScc→FBcc
  4632.     and.w    (CPUTYPE,a6),d0
  4633.     beq    ~fscc99            ;展開しない
  4634. ;fscc dnのマクロ展開(fscc eaはeaを2回出力することになるので保留)
  4635. ;    fscc    .macro    dn
  4636. ;        st.b    dn
  4637. ;        fbcc.w    @true        ;(*)+2+4
  4638. ;        sf.b    dn
  4639. ;    @true:
  4640. ;        .endm
  4641. ;コプロセッサ条件ワードが$0010以上のときはBSUNの処理を伴うので簡単には展開できない
  4642. ;NANでないときだけ展開して,NANのときは060SPに任せる
  4643. ;        fbun.w    1f        ;NANのときは060SPを使う
  4644. ;        st.b    d0        ;SET
  4645. ;        fbcc.w    2f
  4646. ;        sf.b    d0        ;CLEAR(clr.bはccrが変化してしまうので使えない)
  4647. ;        .dc.w    $51FB        ;TRAPF.L #immで次の2ワードをスキップする
  4648. ;    1:    fscc.b    d0        ;060SP
  4649. ;    2:
  4650.     moveq.l    #%111_000,d0
  4651.     and.w    d7,d0
  4652.     bne    ~fscc99            ;dnでないので展開しない
  4653.     cmp.w    #16,d6
  4654.     bhs    ~fscc_1            ;BSUNの処理を伴う
  4655. ;BSUNの処理を伴わない
  4656.     tst.w    d6
  4657.     beq    ~fscc_0            ;FSFのとき
  4658.     moveq.l    #%000_111,d0
  4659.     and.w    d7,d0            ;n
  4660. ;            cc        Dn
  4661.     or.w    #%0101_0000_11_000_000,d0    ;ST.B Dn
  4662.     cmp.w    #15,d6
  4663.     beq    wrt1wobj        ;FSTのとき
  4664.     bsr    wrt1wobj
  4665.     move.w    #$0E00,d0
  4666.     and.w    d7,d0            ;id
  4667. ;            id    s   cc
  4668.     or.w    #%1111_000_01_0_000000,d0    ;FBcc.W
  4669.     or.w    d6,d0            ;condition
  4670.     bsr    wrt1wobj
  4671.     moveq.l    #4,d0
  4672.     bsr    wrt1wobj
  4673. ~fscc_0:
  4674.     moveq.l    #%000_111,d0
  4675.     and.w    d7,d0            ;n
  4676. ;            cc        Dn
  4677.     or.w    #%0101_0001_11_000_000,d0    ;SF.B Dn
  4678.     bra    wrt1wobj
  4679.  
  4680. ;BSUNの処理を伴う
  4681. ~fscc_1:
  4682.     move.w    #$0E00,d0
  4683.     and.w    d7,d0            ;id
  4684. ;            id    s   cc
  4685.     or.w    #%1111_000_01_0_001000,d0    ;FBUN.W
  4686.     bsr    wrt1wobj
  4687.     moveq.l    #10,d0
  4688.     bsr    wrt1wobj
  4689.     moveq.l    #%000_111,d0
  4690.     and.w    d7,d0            ;n
  4691. ;            cc        Dn
  4692.     or.w    #%0101_0000_11_000_000,d0    ;ST.B Dn
  4693.     move.w    #$0E00,d0
  4694.     and.w    d7,d0            ;id
  4695. ;            id    s   cc
  4696.     or.w    #%1111_000_01_0_000000,d0    ;FBcc.W
  4697.     or.w    d6,d0            ;condition
  4698.     bsr    wrt1wobj
  4699.     moveq.l    #10,d0
  4700.     bsr    wrt1wobj
  4701.     moveq.l    #%000_111,d0
  4702.     and.w    d7,d0            ;n
  4703. ;            cc        Dn
  4704.     or.w    #%0101_0001_11_000_000,d0    ;SF.B Dn
  4705.     bsr    wrt1wobj
  4706. ;            cc          s
  4707.     move.w    #%0101_0001_1111101_1,d0    ;TRAPF.L
  4708.     bsr    wrt1wobj
  4709.     move.w    d7,d0            ;FScc.B Dn
  4710.     bsr    wrt1wobj
  4711.     move.w    d6,d0
  4712.     bra    wrt1wobj
  4713.  
  4714. ~fscc99:
  4715. ;fsccは68060ではソフトウェアエミュレーション
  4716. ;cpsccもここを通るがこのままでよい
  4717.     move.w    #C060,d0
  4718.     or.w    d0,(SOFTFLAG,a6)
  4719.     and.w    (CPUTYPE,a6),d0
  4720.     beq    ~fscc1
  4721.     bsr    softwarn
  4722. ~fscc1:
  4723.     DSPOPOUT            ;命令コードの出力
  4724.     move.w    d6,d0
  4725.     bsr    wrt1wobj        ;コプロセッサ条件ワードの出力
  4726.     bra    eadataout
  4727.  
  4728. ;----------------------------------------------------------------
  4729. ;    ftrap<cc>    #xx
  4730. ~ftrapcc::
  4731.     move.w    (FPCPID,a6),d0        ;コプロセッサID
  4732. ~cptrapcc:
  4733.     move.w    d7,d6            ;コプロセッサ条件ワード
  4734.     move.w    #$F078,d7        ;命令コード
  4735.     or.w    d0,d7
  4736.     bsr    gettrapccopr
  4737. ;ftrapccは68060ではソフトウェアエミュレーション
  4738. ;cptrapccもここを通るがこのままでよい
  4739.     move.w    #C060,d0
  4740.     or.w    d0,(SOFTFLAG,a6)
  4741.     and.w    (CPUTYPE,a6),d0
  4742.     beq    ~ftrapcc1
  4743.     bsr    softwarn
  4744. ~ftrapcc1:
  4745.     move.w    d6,d0
  4746.     bsr    wrt1wobj        ;コプロセッサ条件ワードの出力
  4747.     bra    eadataout
  4748.  
  4749.  
  4750. ;----------------------------------------------------------------
  4751. ;    68040/68060キャッシュ制御命令
  4752. ;----------------------------------------------------------------
  4753.  
  4754. ;----------------------------------------------------------------
  4755. ;    cinva/cpusha    <caches>    (68040)
  4756. ~cinvpusha::
  4757.     bsr    getcache        ;キャッシュ選択を得る
  4758.     or.w    d1,d7
  4759.     OPOUTrts
  4760.  
  4761. ;----------------------------------------------------------------
  4762. ;    cinv[lp]/cpush[lp]    <caches>,(An)    (68040)
  4763. ~cinvpushlp::
  4764. ;ColdFireのcpushl (An)はcpushl BC,(An)に相当する
  4765.     tst.b    (CPUTYPE2,a6)
  4766.     bne    ~cinvpushlp1
  4767. ;ColdFireでないときNC/DC/IC/BCが必要
  4768.     bsr    getcache        ;キャッシュ選択を得る
  4769.     bra    ~cinvpushlp2
  4770.  
  4771. ~cinvpushlp1:
  4772. ;ColdFireのときBCのみでBCは省略可能
  4773.     move.w    #$00C0,d1        ;BC
  4774.     cmpi.w    #REG_BC|OT_REGISTER,(a0)
  4775.     bne    ~cinvpushlp3
  4776.     addq.l    #2,a0
  4777. ~cinvpushlp2:
  4778.     CHKLIM
  4779. ~cinvpushlp3:
  4780.     or.w    d1,d7
  4781.     movea.l    a4,a1
  4782.     bsr    geteamode        ;実効アドレスオペランドを得る
  4783.     cmp.w    #EA_ADR,d0
  4784.     bne    iladrerr        ;(An)でなければエラー
  4785.     move.w    (EACODE,a1),d1
  4786.     SETREGL
  4787.     OPOUTrts
  4788.  
  4789. ;----------------------------------------------------------------
  4790. getcache:
  4791.     move.w    (a0)+,d0
  4792.     clr.w    d1
  4793.     cmp.w    #REG_NC|OT_REGISTER,d0
  4794.     beq    getcache9
  4795.     move.w    #$0040,d1
  4796.     cmp.w    #REG_DC|OT_REGISTER,d0
  4797.     beq    getcache9
  4798.     move.w    #$0080,d1
  4799.     cmp.w    #REG_IC|OT_REGISTER,d0
  4800.     beq    getcache9
  4801.     move.w    #$00C0,d1
  4802.     cmp.w    #REG_BC|OT_REGISTER,d0
  4803.     bne    iladrerr
  4804. getcache9:
  4805.     rts
  4806.  
  4807.  
  4808. ;----------------------------------------------------------------
  4809. ;    PMMU制御命令
  4810. ;----------------------------------------------------------------
  4811.  
  4812. ;----------------------------------------------------------------
  4813. ;    pmove    MRn,<ea>/<ea>,MRn    (68851/68030)
  4814. ~pmove::
  4815.     move.l    #((EG_CTRL&EG_ALT)<<16)|(EG_CTRL&EG_ALT),d5
  4816.     move.w    (CPUTYPE,a6),d1        ;68030では MRn,<ea>/<ea>,MRn とも制御・可変モード
  4817.     and.w    #CMMU,d1
  4818.     beq    ~pmove1
  4819.     move.l    #(EG_ALT<<16)|$FFFF,d5    ;68851では MRn,<ea> は可変モード/<ea>,MRn はすべて
  4820. ~pmove1:
  4821.     bsr    getmreg
  4822.     bmi    ~pmove5
  4823.     or.w    #$0200,d7        ;MRn,<ea>
  4824.     or.w    d1,d7
  4825.     CHKLIM
  4826.     movea.l    a4,a1
  4827.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  4828.     move.w    d0,d6
  4829.     swap.w    d5
  4830.     and.w    d5,d0            ;可変 or 制御・可変
  4831.     beq    iladrerr
  4832.     bra    ~pmove6
  4833. ~pmove5:                ;<ea>,MRn
  4834.     movea.l    a4,a1
  4835.     cmp.b    #SZ_LONG,(CMDOPSIZE,a6)
  4836.     bls    ~pmove501        ;.B/.W/.Lが指定されたときはgeteamodeでよい
  4837.     cmpi.w    #'#'|OT_CHAR,(a0)
  4838.     bne    ~pmove501        ;イミディエイト以外はgeteamodeでよい
  4839.     clr.w    (RPNLEN1,a1)
  4840.     clr.w    (RPNLEN2,a1)
  4841. ;1個目
  4842.     addq.l    #2,a0            ;#
  4843.     cmpi.w    #OT_VALUEQ,(a0)
  4844.     bne    ~pmove502        ;符号つき32bitにおさまっていれば普通に1つ取得
  4845.     tst.l    (2,a0)            ;上位32bit
  4846.     beq    ~pmove502        ;上位32bitが0ならば普通に1つ取得
  4847.     move.b    (2+4,a0),d0        ;下位32bitの最上位バイト
  4848.     add.b    d0,d0
  4849.     subx.l    d0,d0            ;下位32bit>=ならば0,下位32bit<0ならば-1
  4850.     cmp.l    (2,a0),d0        ;上位32bitが下位32bitの符号拡張と一致するか
  4851.     beq    ~pmove502        ;上位32bitが下位32bitの符号拡張ならば普通に1つ取得
  4852.     cmpi.w    #','|OT_CHAR,(2+4+4,a0)
  4853.     beq    ~pmove506
  4854.     cmpi.w    #SZ_QUAD|OT_SIZE,(2+4+4,a0)
  4855.     bne    ~pmove502        ;64bit整数の後ろに.q以外の何かが書いてある
  4856.     cmpi.w    #','|OT_CHAR,(2+4+4+2,a0)
  4857.     bne    ~pmove502        ;64bit整数の後ろに.q以外の何かが書いてある
  4858. ~pmove506:
  4859.     moveq.l    #-1,d0
  4860.     move.w    d0,(RPNLEN1,a1)
  4861.     move.w    d0,(RPNLEN2,a1)
  4862.     addq.l    #2,a0            ;OT_VALUEQ
  4863.     move.l    (a0)+,(RPNBUF1,a1)    ;上位32bit
  4864.     move.l    (a0)+,(RPNBUF2,a1)    ;下位32bit
  4865.     cmpi.w    #OT_SIZE|SZ_QUAD,(a0)
  4866.     bne    ~pmove507
  4867.     addq.l    #2,a0
  4868. ~pmove507:
  4869.     bra    ~pmove508
  4870.  
  4871. ~pmove502:
  4872.     lea.l    (RPNBUF1,a1),a2
  4873.     bsr    geteaexpr        ;1個目
  4874.     tst.w    d0
  4875.     bmi    iloprerr        ;#で始まっていてquadでもないのに1個も取得できない
  4876.     movea.l    a0,a3
  4877.     moveq.l    #1-1,d3
  4878.     cmpi.w    #','|OT_CHAR,(a0)+
  4879.     bne    ~pmove503        ;1個で終わり
  4880. ;2個目
  4881.     cmpi.w    #'#'|OT_CHAR,(a0)
  4882.     bne    ~pmove504
  4883.     addq.l    #2,a0
  4884. ~pmove504:
  4885.     cmpi.w    #OT_VALUEQ,(a0)
  4886.     bne    ~pmove505        ;符号つき32bitにおさまっていれば普通に1つ取得
  4887.     tst.l    (2,a0)            ;上位32bit
  4888.     beq    ~pmove505        ;上位32bitが0ならば普通に1つ取得
  4889.     move.b    (2+4,a0),d0        ;下位32bitの最上位バイト
  4890.     add.b    d0,d0
  4891.     subx.l    d0,d0            ;下位32bit>=ならば0,下位32bit<0ならば-1
  4892.     cmp.l    (2,a0),d0        ;上位32bitが下位32bitの符号拡張と一致するか
  4893.     bne    ~pmove503        ;上位32bitが下位32bitの符号拡張ではない
  4894.                     ;2個目が32bitにおさまらないと3個になってしまうので
  4895.                     ;イミディエイトオペランドの続きとはみなさない
  4896. ~pmove505:
  4897.     lea.l    (RPNBUF2,a1),a2
  4898.     bsr    geteaexpr        ;2個目
  4899.     tst.w    d0
  4900.     bmi    ~pmove503        ;2個目はなかった
  4901. ~pmove508:
  4902.     movea.l    a0,a3
  4903.     moveq.l    #2-1,d3
  4904. ~pmove503:
  4905.     movea.l    a3,a0
  4906.     move.b    d3,(EAIMMCNT,a1)
  4907.     move.w    #EAC_IMM,(EACODE,a1)
  4908.     move.b    #EAD_IMM,(EADTYPE,a1)
  4909.     move.w    #EA_IMM,d0
  4910.     bra    ~pmove599
  4911.  
  4912. ~pmove501:
  4913.     clr.b    (EAIMMCNT,a1)
  4914.     bsr    geteamode
  4915. ~pmove599:
  4916.     move.w    d0,d6
  4917.     and.w    d5,d0            ;すべてのモード or 制御・可変
  4918.     beq    iladrerr
  4919.     CHKLIM
  4920.     bsr    getmreg            ;PMMUレジスタを得る
  4921.     bmi    iladrerr
  4922.     or.w    d1,d7
  4923. ~pmove6:
  4924.     cmpi.b    #SZ_QUAD,(CMDOPSIZE,a6)
  4925.     bne    ~pmove9
  4926.     and.w    #EA_DN|EA_AN,d6        ;レジスタ直接はCRP,SRP,DRPに対しては使えない
  4927.     bne    iladrerr
  4928. ~pmove9:
  4929.     cmp.w    #$6100,d7        ;pmovefd <ea>,MMUSR ならエラー
  4930.     beq    iladrerr
  4931.     move.w    d7,d6            ;コプロセッサコマンドワード
  4932.     move.w    #$F000,d7        ;命令コード
  4933.     movea.l    a4,a1
  4934.     or.w    (EACODE,a1),d7
  4935.     DSPOPOUT            ;命令コードの出力
  4936.     move.w    d6,d0
  4937.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  4938.     cmpi.b    #EAD_IMM,(EADTYPE,a1)
  4939.     bne    eadataout
  4940.     cmpi.b    #SZ_QUAD,(CMDOPSIZE,a6)    ;68881のDOUBLEはQUADに変換済み
  4941.     beq    ~pmove90
  4942.     tst.b    (EAIMMCNT,a1)
  4943.     bne    iloprerr        ;quad以外は1個だけ
  4944.     bra    eadataout
  4945.  
  4946. ;PMOVEfd #imm,CRP/SRP/DRP
  4947. ~pmove90:
  4948.     tst.w    (RPNLEN1,a1)
  4949.     bpl    iloprerr        ;定数以外は不可
  4950.     tst.b    (EAIMMCNT,a1)
  4951.     beq    ~pmove91        ;データが1個しかないとき
  4952.     tst.w    (RPNLEN2,a1)
  4953.     bpl    iloprerr        ;定数以外は不可
  4954.     move.l    (RPNBUF1,a1),d0
  4955.     bsr    wrt1lobj
  4956.     move.l    (RPNBUF2,a1),d0
  4957.     bra    wrt1lobj
  4958.  
  4959. ~pmove91:
  4960.     move.l    (RPNBUF1,a1),d0        ;下位32bit
  4961.     add.l    d0,d0
  4962.     subx.l    d0,d0            ;上位32bitは下位32bitを符号拡張して求める
  4963.     bsr    wrt1lobj        ;($00000000FFFFFFFFはencode.sでOT_VALUEQになっている)
  4964.     move.l    (RPNBUF1,a1),d0        ;下位32bit
  4965.     bra    wrt1lobj
  4966.  
  4967. ;----------------------------------------------------------------
  4968. ;    pmovefd    <ea>,MRn        (68030)
  4969. ~pmovefd::
  4970.     move.w    #EG_CTRL&EG_ALT,d5
  4971.     bra    ~pmove5            ;<ea>,MRn のみ
  4972.  
  4973. ;----------------------------------------------------------------
  4974. ;    PMMUレジスタを得る
  4975. getmreg:
  4976.     move.w    (a0),d0
  4977.     move.b    d0,d1
  4978.     clr.b    d0
  4979.     cmp.w    #OT_REGISTER,d0
  4980.     bne    getmreg9
  4981.     cmp.b    #REG_BAD0,d1
  4982.     bcs    getmreg4
  4983.     cmp.b    #REG_BAC7,d1
  4984.     bls    getmreg_ba
  4985. getmreg4:
  4986.     lea.l    (getmtbl,pc),a1
  4987. getmreg5:
  4988.     move.b    (a1)+,d0
  4989.     beq    getmreg9
  4990.     cmp.b    d0,d1
  4991.     beq    getmreg6
  4992.     addq.l    #2,a1
  4993.     bra    getmreg5
  4994.  
  4995. getmreg6:
  4996.     move.b    (a1)+,d0
  4997.     bpl    getmreg7
  4998.     moveq.l    #SZ_QUAD,d0        ;CRP,SRP,DRPの場合
  4999.     move.w    (CPUTYPE,a6),d1
  5000.     and.w    #CMMU,d1
  5001.     beq    getmreg7        ;68030なら.qのみ
  5002.     cmpi.b    #SZ_DOUBLE,(CMDOPSIZE,a6)
  5003.     beq    getmreg8        ;68851なら.qか.d
  5004. getmreg7:
  5005.     move.b    (CMDOPSIZE,a6),d1
  5006.     bmi    getmreg8
  5007.     cmp.b    d0,d1
  5008.     bne    ilsizeerr
  5009. getmreg8:
  5010.     move.b    d0,(CMDOPSIZE,a6)
  5011.     move.b    (a1)+,d1
  5012.     lsl.w    #8,d1
  5013.     addq.l    #2,a0
  5014.     moveq.l    #0,d0
  5015.     rts
  5016.  
  5017. getmreg9:                ;PMMUレジスタが得られなかった
  5018.     moveq.l    #-1,d0
  5019.     rts
  5020.  
  5021. getmreg_ba:                ;BADn,BACnの場合
  5022.     move.b    d1,d0
  5023.     and.w    #$0007,d1
  5024.     lsl.w    #2,d1
  5025.     or.w    #$7000,d1        ;BAD0~BAD7
  5026.     cmp.b    #REG_BAC0,d0
  5027.     bcs    getmreg_ba1
  5028.     or.w    #$0400,d1        ;BAC0~BAC7
  5029. getmreg_ba1
  5030.     move.b    (CMDOPSIZE,a6),d0
  5031.     bmi    getmreg_ba9
  5032.     cmp.b    #SZ_WORD,d0
  5033.     bne    ilsizeerr
  5034. getmreg_ba9:
  5035.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  5036.     addq.l    #2,a0
  5037.     moveq.l    #0,d0
  5038.     rts
  5039.  
  5040. getmtbl:
  5041.     .dc.b    REG_TC,  SZ_LONG,$40
  5042.     .dc.b    REG_DRP, SZ_NONE,$44
  5043.     .dc.b    REG_SRP, SZ_NONE,$48
  5044.     .dc.b    REG_CRP, SZ_NONE,$4C
  5045.     .dc.b    REG_CAL, SZ_BYTE,$50
  5046.     .dc.b    REG_VAL, SZ_BYTE,$54
  5047.     .dc.b    REG_SCC, SZ_BYTE,$58
  5048.     .dc.b    REG_AC,  SZ_WORD,$5C
  5049.  
  5050.     .dc.b    REG_PSR, SZ_WORD,$60
  5051.     .dc.b    REG_PCSR,SZ_WORD,$64
  5052.  
  5053.     .dc.b    REG_TT0, SZ_LONG,$08
  5054.     .dc.b    REG_TT1, SZ_LONG,$0C
  5055.     .dc.b    0
  5056.     .even
  5057.  
  5058. ;----------------------------------------------------------------
  5059. ;    pflusha                (68851/68030/68040)
  5060. ~pflusha::
  5061.     move.w    (CPUTYPE,a6),d1
  5062.     and.w    #C040|C060,d1
  5063.     bne    ~pflushan
  5064.     addq.l    #asm1skipofst,(sp)    ;行末のチェックは行わない
  5065.     move.w    #$F000,d0        ;68851/68030のpflusha
  5066.     bsr    wrt1wobj        ;命令コードの出力
  5067.     move.w    #$2400,d0
  5068.     bra    wrt1wobj        ;コプロセッサコマンドワードの出力
  5069.  
  5070. ;----------------------------------------------------------------
  5071. ;    pflushan            (68040)
  5072. ~pflushan::
  5073.     OPOUT
  5074.     addq.l    #asm1skipofst,(sp)    ;行末のチェックは行わない
  5075.     rts
  5076.  
  5077. ;----------------------------------------------------------------
  5078. ;    pflush    <fc>,#xx/<fc>,#xx,<ea>/(An)    (68851/68030/68040)
  5079. ~pflush::
  5080.     move.w    (CPUTYPE,a6),d1
  5081.     and.w    #C040|C060,d1
  5082.     bne    ~pflushn
  5083.     move.w    #$3000,d7        ;68851/68030のpflush
  5084.     bra    ~pflushs
  5085.  
  5086. ;----------------------------------------------------------------
  5087. ;    pflushn/plpaw/plpar    (An)    (68040)
  5088. ~pflushn::
  5089.     movea.l    a4,a1
  5090.     bsr    geteamode        ;実効アドレスオペランドを得る
  5091.     cmp.w    #EA_ADR,d0
  5092.     bne    iladrerr        ;(An)でなければエラー
  5093.     move.w    (EACODE,a1),d1
  5094.     SETREGL
  5095.     OPOUTrts
  5096.  
  5097. ;----------------------------------------------------------------
  5098. ;    pflushs    <fc>,#xx/<fc>,#xx,<ea>    (68851)
  5099. ~pflushs::
  5100.     bsr    getfc            ;fcを得る
  5101.     or.w    d1,d7
  5102.     CHKLIM
  5103.     movea.l    a5,a1
  5104.     bsr    geteamode        ;実効アドレスオペランドを得る
  5105.     cmp.w    #EA_IMM,d0
  5106.     bne    iladrerr        ;#xxでなければエラー
  5107.     tst.w    (RPNLEN1,a1)
  5108.     bpl    exprerr            ;定数が得られなければエラー
  5109.     moveq.l    #7,d0            ;68030では0~7
  5110.     move.w    (CPUTYPE,a6),d1
  5111.     and.w    #CMMU,d1
  5112.     beq    ~pflushs1
  5113.     moveq.l    #15,d0            ;68881では0~15
  5114. ~pflushs1:
  5115.     move.l    (RPNBUF1,a1),d1
  5116.     cmp.l    d0,d1
  5117.     bhi    ilvalueerr
  5118.     lsl.w    #5,d1
  5119.     or.w    d1,d7
  5120.     tst.w    (a0)
  5121.     bne    ~pflushs2
  5122.     move.w    #$F000,d0        ;<fc>,#xx
  5123.     bsr    wrt1wobj        ;命令コードの出力
  5124.     move.w    d7,d0
  5125.     bra    wrt1wobj        ;コプロセッサコマンドワードの出力
  5126.  
  5127. ~pflushs2:
  5128.     move.w    d7,d6            ;コプロセッサコマンドワード
  5129.     move.w    #$F000,d7        ;命令コード
  5130.     CHKLIM
  5131.     or.w    #$0800,d6        ;<fc>,#xx,<ea>
  5132.     movea.l    a4,a1
  5133.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  5134.     and.w    #EG_CTRL&EG_ALT,d0    ;制御・可変モード
  5135.     beq    iladrerr
  5136.     or.w    (EACODE,a1),d7        ;アドレッシングモードをセット
  5137.     DSPOPOUT            ;命令コードの出力
  5138.     move.w    d6,d0
  5139.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  5140.     bra    eadataout
  5141.  
  5142. ;----------------------------------------------------------------
  5143. ;    ploadw/ploadr    <fc>,<ea>    (68851/68030)
  5144. ~ploadwr::
  5145.     bsr    getfc            ;fcを得る
  5146.     or.w    d1,d7
  5147.     move.w    d7,d6            ;コプロセッサコマンドワード
  5148.     move.w    #$F000,d7        ;命令コード
  5149.     CHKLIM
  5150.     movea.l    a4,a1
  5151.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  5152.     and.w    #EG_CTRL&EG_ALT,d0    ;制御・可変モード
  5153.     beq    iladrerr
  5154.     or.w    (EACODE,a1),d7
  5155.     DSPOPOUT            ;命令コードの出力
  5156.     move.w    d6,d0
  5157.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  5158.     bra    eadataout
  5159.  
  5160. ;----------------------------------------------------------------
  5161. ;    ptestw/ptestr    <fc>,<ea>,#xx/<fc>,<ea>,#xx,An/(An)    (68851/68030/68040)
  5162. ~ptestwr::
  5163.     move.w    (CPUTYPE,a6),d1
  5164.     and.w    #C040,d1
  5165.     bne    ~ptestwr40
  5166.     bsr    getfc            ;fcを得る 68851/68030のptestw/ptestr
  5167.     or.w    d1,d7
  5168.     move.w    d7,d6            ;コプロセッサコマンドワード
  5169.     move.w    #$F000,d7        ;命令コード
  5170.     CHKLIM
  5171.     movea.l    a4,a1
  5172.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  5173.     and.w    #EG_CTRL&EG_ALT,d0    ;制御・可変モード
  5174.     beq    iladrerr
  5175.     CHKLIM
  5176.     movea.l    a5,a1
  5177.     bsr    geteamode        ;実効アドレスオペランドを得る
  5178.     cmp.w    #EA_IMM,d0
  5179.     bne    iladrerr        ;#xxでなければエラー
  5180.     tst.w    (RPNLEN1,a1)
  5181.     bpl    exprerr            ;定数が得られなければエラー
  5182.     move.l    (RPNBUF1,a1),d1
  5183.     cmp.l    #7,d1
  5184.     bhi    ilvalueerr        ;0~7でなければエラー
  5185.     ror.w    #6,d1
  5186.     or.w    d1,d6
  5187.     tst.w    (a0)
  5188.     beq    ~ptestwr1        ;<fc>,<ea>,#xx
  5189.     CHKLIM
  5190.     or.w    #$0100,d6        ;<fc>,<ea>,#xx,An
  5191.     bsr    getareg            ;アドレスレジスタオペランドを得る
  5192.     bmi    iladrerr
  5193.     lsl.w    #5,d1
  5194.     or.w    d1,d6
  5195. ~ptestwr1:
  5196.     movea.l    a4,a1
  5197.     or.w    (EACODE,a1),d7
  5198.     DSPOPOUT            ;命令コードの出力
  5199.     move.w    d6,d0
  5200.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  5201.     bra    eadataout
  5202.  
  5203. ~ptestwr40:                ;68040のptestw/ptestr
  5204.     lsr.w    #4,d7
  5205.     and.w    #$0020,d7
  5206.     or.w    #$F548,d7        ;命令コード
  5207.     movea.l    a4,a1
  5208.     bsr    geteamode        ;実効アドレスオペランドを得る
  5209.     cmp.w    #EA_ADR,d0
  5210.     bne    iladrerr        ;(An)でなければエラー
  5211.     move.w    (EACODE,a1),d1
  5212.     SETREGL
  5213.     OPOUTrts
  5214.  
  5215. ;----------------------------------------------------------------
  5216. getfc:
  5217.     move.w    (a0)+,d0
  5218.     moveq.l    #$0000,d1
  5219.     cmp.w    #REG_SFC|OT_REGISTER,d0    ;SFC
  5220.     beq    getfc9
  5221.     moveq.l    #$0001,d1
  5222.     cmp.w    #REG_DFC|OT_REGISTER,d0    ;DFC
  5223.     beq    getfc9
  5224.     subq.l    #2,a0
  5225.     bsr    getdreg            ;データレジスタオペランドを得る
  5226.     bmi    getfc5
  5227.     or.w    #$0008,d1
  5228.     rts
  5229.  
  5230. getfc5:
  5231.     movea.l    a4,a1
  5232.     bsr    geteamode        ;実効アドレスオペランドを得る
  5233.     cmp.w    #EA_IMM,d0
  5234.     bne    iladrerr        ;#xxでなければエラー
  5235.     tst.w    (RPNLEN1,a1)
  5236.     bpl    exprerr            ;定数が得られなければエラー
  5237.     moveq.l    #7,d0            ;68030では0~7
  5238.     move.w    (CPUTYPE,a6),d1
  5239.     and.w    #CMMU,d1
  5240.     beq    getfc6
  5241.     moveq.l    #15,d0            ;68881では0~15
  5242. getfc6:
  5243.     move.l    (RPNBUF1,a1),d1
  5244.     cmp.l    d0,d1
  5245.     bhi    ilvalueerr
  5246.     or.w    #$0010,d1
  5247. getfc9:
  5248.     rts
  5249.  
  5250. ;----------------------------------------------------------------
  5251. ;    pflushr    <ea>            (68851)
  5252. ~pflushr::
  5253.     move.w    d7,d6            ;コプロセッサコマンドワード
  5254.     move.w    #$F000,d7        ;命令コード
  5255.     movea.l    a4,a1
  5256.     bsr    geteamode        ;実効アドレスオペランドを得る
  5257.     and.w    #EG_MEM,d0        ;メモリモード
  5258.     beq    iladrerr
  5259.     or.w    (EACODE,a1),d7
  5260.     DSPOPOUT            ;命令コードの出力
  5261.     move.w    d6,d0
  5262.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  5263.     bra    eadataout
  5264.  
  5265. ;----------------------------------------------------------------
  5266. ;    pvalid    VAL,<ea>/An,<ea>    (68851)
  5267. ~pvalid::
  5268.     cmp.w    #REG_VAL|OT_REGISTER,(a0)+
  5269.     beq    ~pvalid1        ;VAL,<ea>
  5270.     subq.l    #2,a0
  5271.     or.w    #$0400,d7        ;An,<ea>
  5272.     bsr    getareg            ;アドレスレジスタオペランドを得る
  5273.     bmi    iladrerr
  5274.     SETREGL
  5275. ~pvalid1:
  5276.     CHKLIM
  5277.     move.w    d7,d6            ;コプロセッサコマンドワード
  5278.     move.w    #$F000,d7        ;命令コード
  5279.     movea.l    a4,a1
  5280.     bsr    geteamode_noopc        ;実効アドレスオペランドを得る
  5281.     and.w    #EG_CTRL&EG_ALT,d0    ;制御・可変モード
  5282.     beq    iladrerr
  5283.     or.w    (EACODE,a1),d7
  5284.     DSPOPOUT            ;命令コードの出力
  5285.     move.w    d6,d0
  5286.     bsr    wrt1wobj        ;コプロセッサコマンドワードの出力
  5287.     bra    eadataout
  5288.  
  5289. ;----------------------------------------------------------------
  5290. ;    pb<cc>    <label>            (68851)
  5291. ~pbcc::
  5292.     moveq.l    #0,d0            ;MMUのコプロセッサIDは0
  5293.     bra    ~cpbcc
  5294.  
  5295. ;----------------------------------------------------------------
  5296. ;    pdb<cc>    Dn,<label>        (68851)
  5297. ~pdbcc::
  5298.     moveq.l    #0,d0
  5299.     bra    ~cpdbcc
  5300.  
  5301. ;----------------------------------------------------------------
  5302. ;    prestore    <ea>        (68851)
  5303. ~prestore::
  5304.     moveq.l    #0,d0
  5305.     bra    ~cprestore
  5306.  
  5307. ;----------------------------------------------------------------
  5308. ;    psave    <ea>            (68851)
  5309. ~psave::
  5310.     moveq.l    #0,d0
  5311.     bra    ~cpsave
  5312.  
  5313. ;----------------------------------------------------------------
  5314. ;    ps<cc>    <ea>            (68851)
  5315. ~pscc::
  5316.     moveq.l    #0,d0
  5317.     bra    ~cpscc
  5318.  
  5319. ;----------------------------------------------------------------
  5320. ;    ptrap<cc>    #xx        (68851)
  5321. ~ptrapcc::
  5322.     moveq.l    #0,d0
  5323.     bra    ~cptrapcc
  5324.  
  5325.  
  5326. ;----------------------------------------------------------------
  5327.     .end
  5328.  
  5329.  
  5330. ;----------------------------------------------------------------
  5331. ;    $Log: doasm.s,v $
  5332. ;    Revision 4.9  1999 11/17(Wed) 03:19:02 M.Kamada
  5333. ;    +87 tst (0,a0)+が「オペランドが多すぎます」になる
  5334. ;
  5335. ;    Revision 4.8  1999 10/ 8(Fri) 17:12:16 M.Kamada
  5336. ;    +86 ilsizeerrを細分化
  5337. ;
  5338. ;    Revision 4.7  1999  3/19(Fri) 16:02:11 M.Kamada
  5339. ;    +83 数字ローカルラベルの最大桁数を4桁まで選択可能
  5340. ;
  5341. ;    Revision 4.6  1999  2/28(Sun) 17:57:44 M.Kamada
  5342. ;    +82 エラーメッセージを日本語化
  5343. ;    +82 if成立部のままファイルが終わったとき異常動作する不具合を修正
  5344. ;
  5345. ;    Revision 4.5  1999  2/28(Sun) 00:32:44 M.Kamada
  5346. ;    +82 ColdFireのときCPUSHLがアセンブルできなかった
  5347. ;
  5348. ;    Revision 4.4  1999  2/27(Sat) 23:38:09 M.Kamada
  5349. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  5350. ;
  5351. ;    Revision 4.3  1999  2/24(Wed) 20:00:29 M.Kamada
  5352. ;    +80 ColdFire対応
  5353. ;    +80 .offsym <初期値>,<シンボル>
  5354. ;
  5355. ;    Revision 4.2  1999  2/13(Sat) 20:57:17 M.Kamada
  5356. ;    +79 rtdでinsignificant bitが出る
  5357. ;
  5358. ;    Revision 4.1  1998  8/ 2(Sun) 16:26:30 M.Kamada
  5359. ;    +71 -1のときFMOVE FPn,<label>がエラーになる
  5360. ;
  5361. ;    Revision 4.0  1998  7/ 5(Sun) 20:42:58 M.Kamada
  5362. ;    +67 STOP/LPSTOP #<data> で無意味なビットが立っていたらワーニングを出す
  5363. ;
  5364. ;    Revision 3.9  1998  5/24(Sun) 20:03:40 M.Kamada
  5365. ;    +66 ANDI to SR/CCRで未定義ビットをクリアしようとしたらワーニングを出す
  5366. ;
  5367. ;    Revision 3.8  1998  4/13(Mon) 04:32:06 M.Kamada
  5368. ;    +64 move An,USPの行にラベルがあるとI11対策が行われない
  5369. ;    +64 エラッタの対策を禁止するスイッチを追加
  5370. ;
  5371. ;    Revision 3.7  1998  3/31(Tue) 03:59:26 M.Kamada
  5372. ;    +61 MOVE/ORI/EORI #<imm>,SR/CCR で無意味なビットが立っていたらワーニングを出す
  5373. ;    +62 MOVEP.L (d,An),Dnの展開にSWAPを使う
  5374. ;    +63 jmp/jsrを最適化する
  5375. ;
  5376. ;    Revision 3.6  1998  2/ 8(Sun) 00:57:07 M.Kamada
  5377. ;    +59 jbra/jbsr/jbccにサイズを指定できる
  5378. ;
  5379. ;    Revision 3.5  1998  1/10(Sat) 16:01:56 M.Kamada
  5380. ;    +56 MOVE to USPのエラッタを回避
  5381. ;
  5382. ;    Revision 3.4  1998  1/ 5(Mon) 01:04:23 M.Kamada
  5383. ;    +55 -b[n]
  5384. ;
  5385. ;    Revision 3.3  1997 10/30(Thu) 02:56:58 M.Kamada
  5386. ;    +52 PMOVE.D #imm,CRPが正しくアセンブルできない不具合
  5387. ;    +52 -c0でもCMPA.wl #0,Anが最適化される不具合
  5388. ;
  5389. ;    Revision 3.2  1997 10/12(Sun) 23:31:56 M.Kamada
  5390. ;    (+52 jmp/jsrを最適化する)
  5391. ;
  5392. ;    Revision 3.1  1997 10/12(Sun) 16:17:17 M.Kamada
  5393. ;    +51 bra @f;.rept 30;fadd.x fp0,fp0;.endm;@@:のbraが最適化されないバグを修正
  5394. ;
  5395. ;    Revision 3.0  1997 10/ 6(Mon) 04:28:25 M.Kamada
  5396. ;    +50 シフトローテートの#immが範囲外のときillegal quick size errorになる
  5397. ;
  5398. ;    Revision 2.9  1997  9/24(Wed) 02:50:10 M.Kamada
  5399. ;    +48 ASLの最適化は68040でも行う
  5400. ;
  5401. ;    Revision 2.8  1997  9/23(Tue) 22:25:35 M.Kamada
  5402. ;    +47 movepとfsccのエミュレーションを拡充
  5403. ;
  5404. ;    Revision 2.7  1997  9/15(Mon) 16:34:22 M.Kamada
  5405. ;    +46 error.sを分離,T_EOF=0,SZ_BYTE=0で最適化,move#0も最適化
  5406. ;
  5407. ;    Revision 2.6  1997  9/17(Wed) 22:31:56 M.Kamada
  5408. ;    +44 software emulationの命令を展開する
  5409. ;
  5410. ;    Revision 2.5  1997  9/ 7(Sun) 18:37:11 M.Kamada
  5411. ;    +42 ADDI/SUBI #d3,<ea>→ADDQ/SUBQ #d3,<ea>
  5412. ;
  5413. ;    Revision 2.4  1997  7/16(Wed) 22:22:43 M.Kamada
  5414. ;    +40 FMOVEM.L #imm,FPcrがsoftware emulationになるバグを除去
  5415. ;
  5416. ;    Revision 2.3  1997  7/ 9(Wed) 02:30:03 M.Kamada
  5417. ;    +39 -1の挙動を修正
  5418. ;
  5419. ;    Revision 2.2  1997  6/25(Wed) 12:29:57 M.Kamada
  5420. ;    +35 CMP.bwl #0,Dn→TST.bwl Dn
  5421. ;    +36 MOVE.bw #0,Dn→CLR.bw Dn
  5422. ;    +38 CMPI.bwl #0,<ea>→TST.bwl <ea>
  5423. ;
  5424. ;    Revision 2.1  1997  4/ 5(Sat) 18:44:20 M.Kamada
  5425. ;    +21 サイズ指定のない定数でない絶対ロングを(d,OPC)にする
  5426. ;    +22 btst Dn,<ea>が3バイトになるバグを除去
  5427. ;    +24 MOVEAを最適化する
  5428. ;    +25 CLRを最適化する
  5429. ;    +26 ADDA/CMPA/SUBAを最適化する
  5430. ;    +28 LEAを最適化する
  5431. ;    +29 ASLを最適化する
  5432. ;
  5433. ;    Revision 2.0  1997  2/28(Fri) 13:06:58 M.Kamada
  5434. ;    +16 ptestr/ptestwは68060不可
  5435. ;    +17 chk #imm,dnのオペコードが3バイトになるバグを除去
  5436. ;
  5437. ;    Revision 1.9  1997  2/ 2(Sun) 14:35:15 M.Kamada
  5438. ;    +14 fmove.x #0,#0,#0,fp0などで68030でもsoftware emulationが出るバグを除去
  5439. ;
  5440. ;    Revision 1.8  1997  2/ 1(Sat) 23:38:16 M.Kamada
  5441. ;    +12 「divsl #255,d0:d0」のコードが5バイトになるバグを除去
  5442. ;
  5443. ;    Revision 1.7  1996 12/26(Thu) 00:30:16 M.Kamada
  5444. ;    +02 68060対応
  5445. ;        divs/divu/muls/muluの64bitは68060不可
  5446. ;        lpstop追加
  5447. ;        plpaw/plparはpflushnを利用
  5448. ;        pflusha/pflush/ptestw/ptestrに68060判定を追加
  5449. ;    +07 F43G対策
  5450. ;        後からtrapcc/ftrapccのオペランドなしのスタック操作を修正した
  5451. ;    +08 ソフトウェアエミュレーションの検出
  5452. ;    +10 OPTIONALPCをワークから実行アドレス解釈バッファへ移動
  5453. ;        move (d,opc),(d,an)の不具合解消
  5454. ;
  5455. ;    Revision 1.6  1994/07/28  13:55:08  nakamura
  5456. ;    pflusha,pflushan命令にコメントをつけるとエラーになるバグを修正
  5457. ;    pflush,pflushs命令が異常なコードを出力することのあるバグを修正
  5458. ;
  5459. ;    Revision 1.5  1994/07/12  14:24:40  nakamura
  5460. ;    データサイズコード.qへの対応
  5461. ;    若干のバグフィックス
  5462. ;
  5463. ;    Revision 1.4  1994/06/26  13:05:08  nakamura
  5464. ;    db<cc>/fdb<cc>がOPTIONALPCをクリアしないバグを修正。
  5465. ;    cmpi命令の実効アドレスモードチェックが甘かったのを修正。
  5466. ;
  5467. ;    Revision 1.3  1994/04/09  14:01:00  nakamura
  5468. ;    jbra/jbsr/jb<cc>命令で絶対ロング以外のアドレッシングを使用可能にした。
  5469. ;
  5470. ;    Revision 1.2  1994/03/06  03:02:24  nakamura
  5471. ;    新設命令jbra,jbsr,jbccおよびopcの処理追加
  5472. ;
  5473. ;    Revision 1.1  1994/02/13  13:35:36  nakamura
  5474. ;    Initial revision
  5475. ;
  5476. ;
  5477.